STL常用容器
3.3 deque容器
3.3.1 deque容器基本概念
功能:
- 双端数组,可以对头端进行插入删除操作,也可以对尾端进行插入删除操作 deque与vector区别:
- vector对于头部的插入删除效率低,数据量越大,效率越低
- deque相对而言,对头部的插入删除速度会比vector快
- vector访问元素时的速度会比deque快,这和两者内部实现有关
deque内部工作原理:
deque内部有个中控器,维护每段缓冲区中的内容,缓冲区中存放真实数据
中控器维护的是每个缓冲区的地址,使得使用deque时像一片连续的内存空间
因此它对头部尾部都可以快速删除、插入,只不过访问数据时需要通过地址寻找,访问没有那么快。
deque容器的迭代器也是支持随机访问的。
3.3.2 deque构造函数
功能描述:
- deque容器构造
函数原型:
deque<T> deqT;
//默认构造形式deque(beg, end);
//构造函数将[beg, end)区间中的元素拷贝给本身deque(n, elem);
//构造函数将n个elem拷贝给本身。deque(const deque &deq);
//拷贝构造函数
#include <iostream>
#include <deque>
using namespace std;
void printDeque(const deque<int> &d){
//只读
for(deque<int>::const_iterator it = d.begin(); it != d.end(); it++){
cout << *it << " ";
}
cout << endl;
}
void test01(){
deque<int>d1;
for(int i = 0; i < 10; i++){
d1.push_back(i);
}
printDeque(d1);
deque<int>d2(d1.begin(), d1.end());
printDeque(d2);
deque<int>d3(4, 100);
printDeque(d3);
deque<int>d4(d3);
printDeque(d4);
}
int main(){
test01();
return 0;
}
deque
容器和vector
容器的构造方式几乎一致,灵活使用即可
3.3.3deque赋值操作
函数原型:
deque& operator=(const deque &deq);
//重载等号操作符assign(beg, end);
//将[beg,end)区间中的数据拷贝赋值给本身assign(n, elem);
//将n个 elem拷贝赋值给本身
- 示例代码略
3.3.4 deque大小操作
函数原型:
deque.empty();
deque.size();
deque.resize(num);
deque.resize(num,elem);
该部分与
vector
容器大致相同,不再做解释。
3.3.5 deque插入和删除
函数原型:
- 两端插入操作:
push_back(elem);
//尾插push_front(elem);
//头插pop_back();
//尾删pop_front();
//头删- 指定位置操作:
insert(pos,elem);
//在pos位置插入一个elem元素的拷贝,返回新数据的位置insert(pos, n, elem);
//pos处插n个elem,无返回值insert(pos, beg, end);
//pos处插区间,无返回值clear();
//清空erase(beg, end);
//删除区间,返回下一个数据的位置eras(pos);
//删除pos处数据,返回下一个数据的位置。- 总结:
- 利用
insert
插入某个数据时有返回值,其他没有erase
有返回值,为下一个数据的位置- 最重要一点,插入和删除提供的位置都是迭代器!!!!!
- 代码示例略,与vector相似
3.3.6 deque数据存取
函数原型:
at(int idx);
//返回索引idx所指的数据operator[];
//返回索引idx所指的数据front();
//返回容器中第一个数据元素back();
//返回容器中最后一个数据元素
3.3.7 deque排序
功能描述:
- 利用算法实现对
deque
容器进行排序算法:
sort(iterator beg, iterator end)
//对beg和end区间内元素进行排序- 对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序。因此vector中也可以使用哦。
代码示例:
#include <iostream>
#include <algorithm>
using namespace std;
#include <deque>
void printDeque(const deque<int> &d){
//只读
for(deque<int>::const_iterator it = d.begin(); it != d.end(); it++){
cout << *it << " ";
}
cout << endl;
}
void test01(){
deque<int>d;
d.push_back(10);
d.push_back(20);
d.push_back(30);
d.push_front(200);
d.push_front(300);
printDeque(d);
//对于支持随机访问的迭代器的容器,都可以利用sort算法直接对其进行排序。
sort(d.begin(), d.end());
cout << "sort默认从小到大: " << endl;
printDeque(d);
}
int main(){
test01();
return 0;
}
运行结果:
over 很烦就这样 没办法 little糟糕 ohmygod whywhywhy