一.deque(顺序容器)
deque容器是一个双端容器,支持快速随机访问。在头尾位置插入/删除速度非常快。
例如:
deque<int> dq;
dq.push_back(3);//从尾部压入
dq.push_front(2);//从头部压入
dq.pop_back(); //从尾部弹出
dq.pop_front();//从头部弹出
deque可以使用下表进行访问,也可以使用范围for语句,还可以使用迭代器对deque进行遍历
deque<int>::iterator dq_iter;
for (dq_iter = dq.begin(); dq_iter != dq.end(); ++dq_iter)
{
cout << *dq_iter << endl; //迭代器是指针形式
}
使用迭代器后,无法无法使用下标操作符来查看是容器当中的哪一个数,我们可以使用算法头文件中的(#include<algorithm>)distance()函数来算出下标。
auto dis = distance(dq.begin(),dq_iter);
deque可以使用insert()在中间插入元素
dq_iter = dq.begin();
dq.insert(dq_iter,3); // 在deque容器前面插入3
de_iter = dq.end();
dq.i=nsert(de_iter,10,30) // 在容器末尾插入10个30
dq_iter = dq.begin();
dq_iter += 3; //deque的iter可以直接进行+/-操作
dq.insert(dq_iter, 2, 100); //在第三个元素后面插入2个100
deque可以使用erase()函数在中间随机删除数据:
dq_iter = dq.begin();
dq.erase(dq_iter + 3, dq_iter + 5); //删除(3,5]区间的数据(注意区间)
二.list(顺序容器)
list是一个双向链表,只支持双向顺序访问。在list中任何位置进行插入/删除操作速度都非常的快。
list支持push_back()函数和push_front()函数,也支持pop_back()和pop_front()函数。
同时,list容器还可以使用insert() 函数从中间插入:
例如:
list<int> a;
a.push_back(3);//尾部插入
a.push_back(4);
a.push_back(5);
a.push_front(2); //头部插入
a.push_front(1);
a.push_front(0);
list<int>::iterator list_iter;
list_iter = a.begin();
a.insert(list_iter,10); //在第一个数前面插入10.
list_iter = a.begin();
for (int i = 0; i < 3; i++) //list容器的迭代器,不能直接跳到某个位置,如果需要在
list_iter++; //从a.begin()位置开始,往后移3个位置
a.insert(list_iter, 4, 0); // 在第三个数后面插入4个0
同时,list还可以利用insert()在容器中插入数据区间
list_iter = a.begin();
list<int> b;
b.push_back(100);
b.push_back(200);
b.push_back(300);
a.insert(list_iter, b.begin(), b.end()); // 在a容器的开头插入[b.begin(),b.end()]的数据。
list访问成员数据,不支持下标操作符,所以访问可以使用范围for语句或者使用迭代器。
list删除数据也非常的简单,使用erase()函数即可。括号内是迭代器类型,表明删除迭代器指定位置的数据,同时也可以删除指定区间的数据。
list数据支持自动排序,使用的函数为sort(),操作完后,顺序会自动从小到大排列。同时可以使用reverse()函数对数据进行反转,两个配合起来使用,可以达到从大到小排列的目的。
a.sort(); //数据从小到大排列
a.reverse();//数据进行反转
三、stack(顺序容器适配器)
stack是一种栈的数据结构,相信学过数据结构的同学对这个应该特别熟悉。先进后出/后进先出是它的一个重要特点,它是一个自适应容器。
栈可以定义成多种类型:
stack<int, vector<int>> a; //vector类型的栈
stack<int, list<int>> b; //list类型
stack<int, deque<int>> c; //deque类型
stack<int> d; //默认类型,为deque类型
向栈中压数据使用push()函数,弹出数据使用pop()函数;
访问栈的顶层数据使用top()函数;
查看栈的大小使用size()函数;
判断栈是否为空栈,使用empty()函数。
栈看似简单,觉得也没啥用,实际则不然,在底层系统相关的程序当中使用的比较多。如底层内存的分配,函数的调用等等。
四、queue(顺序容器适配器)
队列容器,先进先出。和stack一样,是一个自适应容器。
可以用list类做队列,还可以用deque做队列。但是和stack不一样的是,queue不能用vector来做队列。可以进行双向操作。
几个常用函数的介绍:
q.empty():判断队列是否为空
q.size() : 查看队列的大小
q.front() : 查看队首元素
q.back() : 查看对位元素
q.pop() : 出队,从队为删除数据
q.push(item) : 入队,从队首插入数据
五、priority_queue(顺序容器适配器)
最大值/最小值优先级队列,是一个自适应容器,但是不能用list来做队列。
用法和queue一样。先进先出,压进去的数据会进行排队,弹出来的数据为当前数据中的最大值/最小值
默认情况下,为最大值。如果最小值优先级队列的话,需要加上grater的标签,如下:
priority_queue<int> q1;//默认情况,最大值队列
priority_queue<int,deque<int>> q2;//默认情况,最大值队伍
priority_queue<int,deque<int>,grater<int>> q3; //最小值优先级队列