【Deque 容器结构】
deque是双向开口的连续线性空间(动态将多个连续空间通过指针数组接合在一起),随时可以增加一段新的空间,所以数据想vector里面的分配,复制,释放操作不会发生。deque头尾两端分别做插入和删除操作都是常数时间。能用vector尽量使用vector,通过deque用来做队列即可,十分方便的。
【deque 用法】
容器deque和容器vector非常相似,属于序列式容器。都采用动态数组来管理元素,提供随机存取,并且有着和vector一样的接口。不同的是deque具有首尾两端进行快速插入、删除的能力。
【deque 的创建】
#include<iostream>
#include<deque>
using namespace std;
int main() {
deque<int> c;
cout << c.size() << endl;
deque<int> c1(c);
deque<int> c2(4, 10);
for (auto i = c2.begin(); i != c2.end(); i++) {
cout << *i << " ";
}
cout << endl;
// assign函数
c.assign(3, 10);
for (auto i = c.begin(); i != c.end(); i++) {
cout << *i << " ";
}
cout << endl;
deque<int> c3 = { 1,2,3,4,5,6 };
// 正向迭代器
deque<int>::iterator it;
for (it = c3.begin(); it != c3.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 反向迭代器
deque<int>::reverse_iterator it1;
for (it1 = c3.rbegin(); it1 != c3.rend(); it1++) {
cout << *it1 << " ";
}
system("pause");
}
【数据访问 】
deque容器支持很多数据的访问形式,基本上与vector是一样的。
#include<iostream>
#include<deque>
using namespace std;
// 数据访问
int main() {
deque<int> c = { 1,2,3,4,5,6 };
// 对 deque容器数据进行访问
// 1. at
cout << c.at(3) << endl;
// 2. front
cout << c.front() << endl;
// 3. back
cout << c.back() <<endl;
// 4. begin:返回第一个数据的迭代器
cout << *c.begin() << endl;
// 5. end:返回指向最后一个数据的下一个位置的迭代器
cout << *(c.end() - 1) << endl;
// 6. rbegin and rend
for (deque<int>::reverse_iterator it = c.rbegin(); it != c.rend(); it++) {
cout << *it << " ";
}
cout << endl;
for (auto it = c.rbegin(); it != c.rend(); it++) {
cout << *it << " ";
}
system("pause");
}
【添加数据 insert】
insert用于向deque中插入数据。
#include<iostream>
#include<deque>
using namespace std;
int main() {
deque<int> c;
c.push_back(1);
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
c.push_front(2);
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
c.insert(c.begin(), 3);
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
c.insert(c.end(), 2, 10);
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
system("pause");
}
【deque 删除元素】
代码基本上与上篇博客中vector是一样的。
#include<iostream>
#include<deque>
using namespace std;
int main() {
deque<int> c = {1,2,3,4,5,6,7,8,9,0};
c.pop_back(); //删除最后一个元素
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 删除头部元素
c.pop_front();
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 删除 pos位置的数据
c.erase(c.begin());
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 判断deque是否为空
if (c.empty()) {
cout << "deque 容器为空" << endl;
}
else {
cout << "deque容器不为空" << endl;
}
// resize函数 deque队列的长度为n, 只保留队列前n个数
c.resize(6);
for (auto it = c.begin(); it != c.end(); it++) {
cout << *it << " ";
}
cout << endl;
// 在deque中 查找某个元素
deque<int>::iterator it = find(c.begin(), c.end(), 5);
if (it != c.end()) {
cout << "已经找到元素: " << *it << endl;
}
else {
cout << "没有找到该元素" << endl;
}
// 反向遍历元素
deque<int>::reverse_iterator it1;
for (it1 = c.rbegin(); it1 != c.rend(); it1++) {
cout << *it1 << " ";
}
system("pause");
}