deque是STL中的部分,中文意思为"双端队列"。deque头端和尾端都能实现快速的元素的插入和删除,而vector只能在尾端实现快速插入删除。但是在中间中端实现插入和删除和vector相似,对比头尾端会慢很多。
使用deque时需要带上头文件和命名空间:
#include <deque>
using namespace std;
一.deque 默认构造和带参构造
//edque 的默认构造
deque<int> deqInt; //存放int类型的deque容器
deque<float> deqFloat; //存放float类型的deque容器
deque<student> deqStu; //存放自定义类的容器
//deque 的带参构造
deque<int> deqInt1(10); //存放10个元素在deqInt1中,元素值默认为0
deque<int> deqInt2(10, 666); //存放10个元素在deqInt2中,元素值为666
deque<int> deqInt3(deqInt.begin(), deqInt.end());//将[begin,end)区间中的元素拷贝给deqInt3
deque<int> deqInt4(deqInt1); //将deqInt1中的所有元素拷贝给deqInt4
二.deque的赋值
deque<int> deqIntA, deqIntB, deqIntC, deqIntD;
deqIntA.push_back(1);
deqIntA.push_back(2);
deqIntA.push_back(3);
deqIntA.push_back(4);
deqIntA.push_back(5);
//assign赋值
deqIntB.assign(deqIntA.begin(), deqIntA.end()); //将deqIntA[begin end)区间的元素赋值给deqIntB
deqIntC.assign(4, 888); //给deqIntC重新分配元素个数为4,元素值为888
// = 赋值
deqIntD = deqIntA; //将deqIntA的所有元素赋值给deqIntD
//swap交换
deqIntD.swap(deqIntC); //交换deqIntC和deqIntD的元素和值
三.deque的大小
deque<int> deqIntA(5, 5);
//size查看元素个数
cout << "deque 的元素个数: " << deqIntA.size() << endl; //打印出deqIntA的元素个数
//resize调整大小
deqIntA.resize(7); //重新调整元素个数,扩长的部分默认为0
deqIntA.resize(3); //重新调整元素个数,缩短剩3个元素,其余全被移除
deqIntA.resize(8, 1); //重新调整元素个数,扩长部分的元素值为1
四.deque头部和尾部的添加与删除元素
deque<int> deqInt;
//push_back尾部添加
deqInt.push_back(4); //尾部添加一个元素,值为1
deqInt.push_back(5); //尾部添加一个元素,值为2
deqInt.push_back(6); //尾部添加一个元素,值为2
//push_front头部添加
deqInt.push_front(3); //头部添加一个元素,值为3
deqInt.push_front(2); //头部添加一个元素,值为2
deqInt.push_front(1); //头部添加一个元素,值为1
//pop_back尾部移除
deqInt.pop_back(); //移除最尾部一个元素 剩余1 2 3 4 5
//pop_front头部移除
deqInt.pop_front(); //移除最头部一个元素 剩余2 3 4 5
五.deque的数据存取
//下标存取
//注意越界访问
int i2 = deqInt[1]; //int变量i2被赋值为deqInt下标为1的元素
deqInt[1] = 888; //将下标为1的元素的值改为888
//at存取
//注意越界访问
int i1 = deqInt.at(0); //int变量i1被赋值为deqInt下标为0的元素
deqInt.at(0) = 666; //将下标为0的元素的值改为666
//front back存取
int iFront = deqInt.front(); //将最前元素的值赋值给iFront
int iBack = deqInt.back(); //将最后元素赋值给iBack
deqInt.front() = iFront; //将iFront的值赋值给最前元素
deqInt.back() = iBack; //将iBack的值赋值给最后元素
六.deque的插入与删除
deque<int> deqInt, deqInt1;
deqInt.push_back(1);
deqInt.push_back(2);
deqInt.push_back(3);
deqInt.push_back(4);
deqInt1.push_back(10);
deqInt1.push_back(20);
deqInt1.push_back(30);
deqInt1.push_back(40);
//deque插入
deqInt.insert(deqInt.begin(), 0); //在deqInt的最前元素位置插入一个元素0
deqInt.insert(deqInt.begin() + 1, 2, 88); //在deqInt的最前元素加1的位置插入2个元素,值为88,也就是下标为1的位置
deqInt.insert(deqInt.end(), deqInt1.begin(), deqInt1.end()); //在deqInt的最后元素位置拷贝插入deqInt[begin end)区间的元素 注意:[前闭后开)
deqInt.insert(deqInt.end(), deqInt1.rbegin(), deqInt1.rend()); //在deqIntR的最后面元素位置逆转拷贝插入deqIntY[begin end)区间的元素 注意:[前闭后开)
//deque删除
//删除单个元素
deqInt.erase(deqInt.begin() + 1); //删除最前元素加1的元素,也就是下标为1的元素
//删除多个元素
deqInt.erase(deqInt.begin() + 1, deqInt.begin() + 3); //删除[deqIntR[1] deqIntR[3])区间的元素 注意:[前开后闭),也就是删除下标为1的元素到下标为2的元素
//删除所有元素
deqInt.erase(deqInt.begin(), deqInt.end()); //删除所有元素
deqInt.clear(); //删除所有元素
//使用迭代器删除元素中指定的值
for (deque<int>::iterator it = deqInt.begin(); it != deqInt.end();) {
if (*it == 4) {
it = deqInt.erase(it);
}
else {
cout << *it << "\t";
it++;
}
}
七.deque与迭代器
deque<int> deqInt(10, 5);
//下标访问元素
for (unsigned int i = 0; i < deqInt.size(); i++) {
cout << deqInt[i] << "\t";
}
//普通迭代器访问元素
for (deque<int>::iterator it = deqInt.begin(); it != deqInt.end(); it++) {
(*it)++; //注意:(*it)++是取值再加加操作,而*it++是加加指针再取值
cout << *it << "\t";
}
//常量迭代器访问元素
for (deque<int>::const_iterator cit = deqInt.cbegin(); cit != deqInt.cend(); cit++) {
// (*it)++; //注意:常量迭代器不能修改值
cout << *cit << "\t";
}
//逆转迭代器访问元素
for (deque<int>::reverse_iterator rit = deqInt.rbegin(); rit != deqInt.rend(); rit++) {
cout << *rit << "\t";
}
//常量逆转迭代器访问元素
for (deque<int>::const_reverse_iterator crit = deqInt.crbegin(); crit != deqInt.crend(); crit++) {
//(*crit)++; //注意:常量的逆转迭代器不能修改值
cout << *crit << "\t";
}