vector容器
1 vector构造函数
vector
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身。
vector(n, elem);//构造函数将n个elem拷贝给本身。
vector(const vector &vec);//拷贝构造函数。
//例子 使用第二个构造函数 我们可以...
int arr[] = {2,3,4,1,9};
vector
2 vector常用赋值操作
1.assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
2.assign(n, elem);//将n个elem拷贝赋值给本身。
3.vector& operator=(const vector &vec);//重载等号操作符
swap(vec);// 将vec与本身的元素互换。
3 vector大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长>度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。
4 vector数据存取操作
at(int idx); //返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
5 vector插入和删除操作
insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele.
push_back(ele); //尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
// vector容器的迭代器 随机访问迭代器
//如何判断一个容器的迭代器是否支持随机访问
vector::iterator itBegin = v1.begin();
itBegin = itBegin + 2; //如果语法通过 支持随机访问
deque容器
1 deque构造函数
deque
deque(beg, end);//构造函数将[beg, end)区间中的元素拷贝给本身。
deque(n, elem);//构造函数将n个elem拷贝给本身。
deque(const deque &deq);//拷贝构造函数。
2 deque赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
deque& operator=(const deque &deq); //重载等号操作符 直接d1=d2
swap(deq);// 将deq与本身的元素互换
3 deque大小操作
deque.size();//返回容器中元素的个数
deque.empty();//判断容器是否为空
deque.resize(num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
deque.resize(num, elem); //重新指定容器的长度为num,若容器变长,则以elem值填充新位置,如果容器变短,则末尾超出容器长度的元素被删除。
4 deque双端插入和删除操作
push_back(elem);//在容器尾部添加一个数据
push_front(elem);//在容器头部插入一个数据
pop_back();//删除容器最后一个数据
pop_front();//删除容器第一个数据
5 deque数据存取
at(idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range。 d.at(i)
operator[];//返回索引idx所指的数据,如果idx越界,不抛出异常,直接出错。 d[i]
front();//返回第一个数据。
back();//返回最后一个数据
6 deque插入操作
insert(pos,elem);//在pos位置插入一个elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
7 deque删除操作
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
8 deque排序
sort( begin, end ) 利用sort排序,默认从小到大升序排序
对于支持随机访问的迭代器的容器都可以用sort 要添加algorithm头文件
stack容器
栈容器符合先进后出,不允许有遍历行为,栈用enpty可以判断容器是否为空,用size可以返回栈中数据个数
1 stack构造函数
stack
stack(const stack &stk);//拷贝构造函数
2 stack赋值操作
stack& operator=(const stack &stk);//重载等号操作符
3 stack数据存取操作
push(elem);//向栈顶添加元素
pop();//从栈顶移除第一个元素
top();//返回栈顶元素
4 stack大小操作
empty();//判断堆栈是否为空
size();//返回堆栈的大小
queque容器
queque队列是先进先出的数据结构。只能从一端新增数据,另一端移除元素,不允许有遍历行为
1 queue构造函数
queue
queue(const queue &que);//拷贝构造函数
2 queue存取、插入和删除操作
push(elem);//往队尾添加元素
pop();//从队头移除第一个元素
back();//返回最后一个元素
front();//返回第一个元素
3 queue赋值操作
queue& operator=(const queue &que);//重载等号操作符
4 queue大小操作
empty();//判断队列是否为空
size();//返回队列的大小
list链表
链表可以对任意位置进行快速的插入或删除。stl中提供的是双向循环链表和双向迭代器,只能++来访问
但是对元素的遍历速度没有数组快,list是由数据域和指针域共同组成的,所以占用的空间比较大,动态存储分配,不会造成空间浪费,与vector(溢出后删除)不一样的是,list插入数据后不会对其后的数据产生影响。
1 list构造函数
list
list(beg,end);//构造函数将[beg, end)区间中的元素拷贝给本身。
list(n,elem);//构造函数将n个elem拷贝给本身。
list(const list &lst);//拷贝构造函数。
2 list数据元素插入和删除操作
push_back(elem);//在容器尾部加入一个元素
pop_back();//删除容器中最后一个元素
push_front(elem);//在容器开头插入一个元素
pop_front();//从容器开头移除第一个元素
用迭代器
insert(pos,elem);//在pos位置插elem元素的拷贝,返回新数据的位置。
insert(pos,n,elem);//在pos位置插入n个elem数据,无返回值。
insert(pos,beg,end);//在pos位置插入[beg,end)区间的数据,无返回值。
clear();//移除容器的所有数据
erase(beg,end);//删除[beg,end)区间的数据,返回下一个数据的位置。
erase(pos);//删除pos位置的数据,返回下一个数据的位置。
remove(elem);//删除容器中所有与elem值匹配的元素。
3 list大小操作
size();//返回容器中元素的个数
empty();//判断容器是否为空
resize(num);//重新指定容器的长度为num,
若容器变长,则以默认值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
resize(num, elem);//重新指定容器的长度为num,
若容器变长,则以elem值填充新位置。
如果容器变短,则末尾超出容器长度的元素被删除。
4 list赋值操作
assign(beg, end);//将[beg, end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。
list& operator=(const list &lst);//重载等号操作符
swap(lst);//将lst与本身的元素互换。
5 list数据的存取
list不是连续的存储空间,不能利用 [ ] 和 at 来跳跃式访问,支持双向 it++/ it--
front(); //返回第一个元素。
back(); //返回最后一个元素。
6 list反转排序
reverse(); //反转链表,比如lst包含1,3,5元素,运行此方法后,lst就包含5,3,1元素。
sort(); //list排序
排序
所有系统提供标准算法 使用的容器提供的迭代器必须支持随机访问
不支持随机访问的迭代器的容器 ,内部会对应提供相应的算法的接口
sort(L.begin(), L.end());
L.sort(); //默认排序规则 从小到大
修改排序规则 为 从大到小
L.sort(myCompare);
自定义的数据类型 必须指定排序规则 专门写一个函数
L.sort(myComparePerson);
set容器
所有元素在插入时会自动排序,从小到大排序,set不允许重复的数据。multiset允许重复的数据
1 set构造函数
set
mulitset
set(const set &st);//拷贝构造函数
2 set赋值操作
set& operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
3 set大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
4 set插入和删除操作
insert(elem);//在容器中插入元素。(只有insert)
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。
5 set查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;若不存在,返回set.end();
count(key);//查找键key的元素个数
pair对组
第一种
pair
第二种声明
pair
用p.first 和 p.second 访问两个数据
6 set排序
set存放内置数据类型
//利用仿函数 指定set容器的排序规则
class MyCompare
{
public:
bool operator()(int v1 ,int v2)//重载小括号
{
return v1 > v2;
}
};
//插入之前 指定排序规则
for (set::iterator it = s.begin(); it != s.end();it++)
{
cout << *it << endl;
}
set存放自定义数据类型(对于自定义数据类型,必须指定排序规则)
class Person
{
public:
Person(string name,int age)
{
this->m_Name = name;
this->m_Age = age;
}
string m_Name;
int m_Age;
};
class MyComparePerson
{
public:
bool operator()(const Person & p1 , const Person & p2)
{
//年龄 升序
return p1.m_Age < p2.m_Age;
}
};
void test06()
{
set s;
Person p1("aaa", 10);
Person p2("bbb", 30);
Person p3("ccc", 20);
Person p4("ddd", 50);
Person p5("eee", 40);
s.insert(p1);
s.insert(p2);
s.insert(p3);
s.insert(p4);
s.insert(p5);
//对于自定义数据类型,必须指定排序规则
for (set::iterator it = s.begin(); it != s.end(); it++)
{
cout << "姓名: " << (*it).m_Name << " 年龄: " << it->m_Age << endl;
}
}
map容器
map所有元素都是pair,一个元素是key,起到索引作用,另一个元素是value,所有元素会根据键值自动排序。map和multimap的区别是 是否可以含有重复的key值。
1 map构造函数
map
map(const map &mp);//拷贝构造函数
2 map赋值操作
map& operator=(const map &mp);//重载等号操作符
swap(mp);//交换两个集合容器
3 map大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空
4 map插入数据元素操作
map.insert(...); //往容器插入元素,返回pair
//创建map容器
map m;
//插入方式
//第一种
m.insert(pair(1, 10));
//第二种
m.insert(make_pair(2, 20));
//第三种
m.insert(map::value_type(3, 30));
//第四种不建议插数,建议用来查找数据
m[4] = 40;
5 map删除操作
clear();//删除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。
//按照key进行删除元素
m.erase(3);
//全删除
m.clear();
//用迭代器删除
m.erase(m.begin());
6 map查找操作
find(key);//查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
7 map排序
在插入数之前就要提前制定排序规则 map
class MyCompare
{
public:
bool operator()(int v1,int v2)
{
return v1 > v2;
}
};
//指定map容器的排序规则
void test03()
{
//插入4个值
map m;
m.insert(pair(1, 10));
m.insert(make_pair(2, 20));
m.insert(map::value_type(3, 30));
m[4] = 40;
for (map::iterator it = m.begin(); it != m.end(); it++)
{
cout << " key = " << it->first << " value = " << (*it).second << endl;
}
公司今天招聘了10个员工ABCDEFGHIJ,10名员工进入公司之后,需要指派员工在3个部门工作
人员信息有: 姓名 工资
通过Multimap进行信息的插入 保存 显示
分部门显示员工信息 显示全部员工信息
#include;
using namespace std;
#include
#include
#include