C++STL之deque
概念:本质是一个指针数组 并且 deque数据的添加是没有内存移动的
deque对象创建
#include <iostream>
#include <deque>
using namespace std;// 辅助函数:打印deque内容
template<typename T>
void printDeque(const deque<T>& d) {for (const auto& elem : d) {cout << elem << " ";}cout << endl;
}int main() {// 1. 默认构造函数deque<int> d1;cout << "d1: ";printDeque(d1); // 输出空// 2. 初始化列表deque<int> d2_1({9, 8, 8, 6, 5});cout << "d2_1: ";printDeque(d2_1); // 9 8 8 6 5deque<int> d2_2 = {1, 8, 8, 8, 5};cout << "d2_2: ";printDeque(d2_2); // 1 8 8 8 5// 3. 迭代器范围初始化deque<int> d3(d2_1.begin() + 1, d2_1.end() - 1);cout << "d3: ";printDeque(d3); // 8 8 6// 4. 全0初始化(指定元素数量)deque<int> d4(10);cout << "d4: ";printDeque(d4); // 0 0 0 0 0 0 0 0 0 0// 5. 固定值初始化(数量+值)deque<int> d5(8, 6);cout << "d5: ";printDeque(d5); // 6 6 6 6 6 6 6 6// 6. 拷贝构造函数deque<int> d6(d5);cout << "d6: ";printDeque(d6); // 6 6 6 6 6 6 6 6return 0;
}
deque 赋值操作
#include <iostream>
#include <deque>using namespace std;void printDeque(deque<int>& d) {for (deque<int>::iterator iter = d.begin(); iter != d.end(); iter++) {cout << *iter << " ";}cout << endl;
}int main() {deque<int> d = {9, 8, 5, 2, 1, 1};cout << "d: ";printDeque(d);// 1. = 赋值deque<int> d1;d1 = d;cout << "d1: ";printDeque(d1);// 2. assign(迭代器)deque<int> d2;d2.assign(d1.begin() + 1, d1.end());cout << "d2: ";printDeque(d2);// 3. 初始化列表deque<int> d3;d3.assign({1, 2, 3, 5, 6, 7});cout << "d3: ";printDeque(d3);// 4. 初始化 a 个 bdeque<int> d4;d4.assign(8, 6);cout << "d4: ";printDeque(d4);return 0;
}
deque 大小操作
#include <iostream>
#include <deque>using namespace std;// 用于打印双端队列元素的函数
void printDeque(deque<int>& d) {for (int i = 0; i < d.size(); ++i) {cout << d[i] << " ";}cout << endl;
}int main() {deque<int> d;// 检查初始状态下双端队列是否为空以及大小cout << "d.empty() = " << d.empty() << endl;cout << "d.size() = " << d.size() << endl;// 使用初始化列表为双端队列赋值d.assign({1, 2, 3});// 再次检查双端队列是否为空以及大小,并打印元素cout << "d.empty() = " << d.empty() << endl;cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为18d.resize(18);cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为20,新增元素值为6d.resize(20, 6);cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为10000d.resize(10000);cout << "d.size() = " << d.size() << endl;printDeque(d);// 将双端队列大小调整为5d.resize(5);cout << "d.size() = " << d.size() << endl;printDeque(d);return 0;
}
结果
deque 数据插入
#include <iostream>
#include <deque>using namespace std;// 打印双端队列元素的函数
void printDeque(deque<int>& d) {for (deque<int>::iterator iter = d.begin(); iter != d.end(); iter++) {cout << *iter << " ";}cout << endl;
}int main() {deque<int> d;// 1. push_frontd.push_front(-1);d.push_front(-2);d.push_front(-3);// 此时双端队列d:-3 -2 -1printDeque(d); // 2. push_backd.push_back(1);d.push_back(2);d.push_back(3);// 此时双端队列d:-3 -2 -1 1 2 3printDeque(d); // 3. insert// 在迭代器指向位置前插入元素0,位置为d.begin() + 3,即原第4个元素前d.insert(d.begin() + 3, 0); // 此时双端队列d:-3 -2 -1 0 1 2 3printDeque(d); // 在迭代器指向位置前插入元素1,位置为d.end() - 1,即原倒数第2个元素前d.insert(d.end() - 1, 1); // 此时双端队列d:-3 -2 -1 0 1 2 1 3printDeque(d); // 在迭代器指向位置前插入[first, last)范围内的元素,first为d.begin() + 4 ,last为d.begin() + 6d.insert(d.begin() + 1, d.begin() + 4, d.begin() + 6); // 假设原双端队列d:-3 -2 -1 0 1 2 1 3 插入后:-3 1 2 -2 -1 0 1 2 1 3printDeque(d); return 0;
}
#include <iostream>
#include <deque>// 假设的打印函数,用于输出双端队列元素
void printDeque(const std::deque<int>& d) {for (int num : d) {std::cout << num << " ";}std::cout << std::endl;
}int main() {std::deque<int> d = {-1, 9, 8, 5, 5, 2, 1, 1, -1};printDeque(d);d.pop_back();printDeque(d);d.pop_front();printDeque(d);std::deque<int>::iterator it = d.erase(d.begin() + 2);// 9 8 2 1 1printDeque(d);std::cout << *it << std::endl;it = d.erase(it);// 9 8 1 1printDeque(d);std::cout << *it << std::endl;d.erase(d.begin() + 1, d.begin() + 3);printDeque(d);d.clear();printDeque(d);std::cout << "d.empty() = " << d.empty() << std::endl;std::cout << "d.size() = " << d.size() << std::endl;return 0;
}
deque 扩容机制.
deque的物理结构本质其实是 指针数组 每一个指针都指向一块连续的内存 数据从头开始存入
当第一块内存存储满了之后 想继续push_frort()时 那么数据会存储在末尾 当数据即将溢出时会继续扩容
底层原代码
deque 随机访问
#include <iostream>
#include <deque>
using namespace std;int main() {deque<int> d = { 9, 8, 7, 6, 5 };cout << d[2] << endl;cout << d.at(2) << endl;cout << d.front() << endl;cout << d.back() << endl;return 0;
}