一、基本概念
deque容器实际上是一个双端数组,可以对头端进行插入和删除操作。deque容器和vector容器的用法基本相同,他们的不同点在于:
1.vector 对于头部的插入删除效率低,因为vector无法直接对头部元素进行操作。
2.deque容器相对vector而言,对头部插入删除速度较快。
3.vector访问元素时的速度比deque块,这和两者的内部实现有关。
在实际应用中,我们要会根据实际情况选择不同的容器完成任务。
二、基本方法
deque的构造方法和vector的构造方法相同,可以参照我的另一篇关于vector容器的讲解的文章C/C++笔记总结——vector容器_给你糖ya的博客-CSDN博客。也可以看我写的构造一个deque容器的代码。
2.1 构造函数
void text01() { //构造函数
deque<int>d1; //1.尾插法赋值
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
printDeque(d1);
deque<int>d2 = d1; //2.等号赋值 拷贝构造
printDeque(d2);
deque<int>d3;
d3.assign(d2.begin(), d2.end()); //3.assign区间赋值
printDeque(d3);
deque<int>d4;
d4.assign(10, 100); //4.assign赋值n个值
printDeque(d4);
deque<int>d5(10, 100); //5.创建时赋值
}
2.2 其他基本方法
下面列出关于deque容器的其他基本方法。
方法名 | 功能 | 注意事项 |
---|---|---|
push_back(elem) | 尾删特定元素elem | |
push_front(elem) | 头插特定元素elem | |
empty() | 判断是否为空 | 返回值是bool类型,为空返回true,否则返回false |
size() | 返回容器大小 | |
resize(elem) | 重新指定大小为elem | 若elem比原容器大小大,用0补充;若elem比原容器大小小,删除多余元素 |
pop_back() | 尾删元素 | |
pop_front() | 头删元素 | |
insert(pos,elem) | 在pos处插入elem元素的拷贝 | pos是迭代器,不是int型数字 |
insert(pos,n,elem) | 在pos位置插入n个elem数据 | pos是迭代器,不是int型数字 |
clear() | 清空容器所有数据 | |
erase(begin,end) | 删除[begin,end)区间的数据 | 参数是迭代器,不是int型数字 |
erase(pos) | 删除pos位置的数据 | pos是迭代器,不是int型数字 |
front() | 返回头部元素 | |
back() | 返回尾部元素 | |
sort(iterator begin,iterator end) | 对begin和end区间内的元素进行排序 | 参数是迭代器,不是int型数字 |
2.3 迭代器简单理解
大家需要注意的是,在进行插入和删除操作的时候,参数是迭代器(iterator),不是int类型。迭代器在初期可以简单理解为 begin(),end() 是迭代器。我们先看基本的插入和删除操作:
void text() { //插入和删除操作
deque<int>d1;
d1.push_back(10); //尾插
d1.push_back(30);
d1.push_back(5);
d1.push_front(20); //头插
printDeque(d1);
d1.pop_back(); //尾删
d1.pop_front(); //头删
printDeque(d1);
//insert插入
d1.insert(d1.begin(), 100);
printDeque(d1);
d1.insert(d1.begin(), 2, 400); //在头部插入2个400
printDeque(d1);
//删除
d1.erase(d1.begin(),d1.end());
那如果我们想对除了头尾之外的位置进行插入和删除操作怎么办呢?这时候我们需要提前声明一个迭代器 it ,对 it 可以进行加减操作。
d1.erase(d1.begin(),d1.end());
deque<int>::iterator it = d1.begin();
//中间对it进行加减操作
it++;
d1.erase(it);
2.4 大小操作
了解一下 empty 和 resize 的基本用法。
void text() { //大小操作
deque<int>d1; //1.尾插法赋值
for (int i = 0; i < 10; i++) {
d1.push_back(i);
}
printDeque(d1);
if (d1.empty()) { //如果d1为空
cout << "d1为空" << endl;
}
else {
cout << "d1不为空" << endl;
cout << "d1的大小为:" << d1.size() << endl;
//deque容器没有容量的概念,因为可以无限往里填充数据
}
//重新指定大小
d1.resize(15); //默认多出的位数用0填充
printDeque(d1);
d1.resize(15, 4); //用4填充多余位数
d1.resize(5); //如果小于原来的大小,会删除多余元素
}