c++ 中deque的用法
时间: 2024-07-07 09:00:49 浏览: 105
在C++中,`deque`(双端队列)是一种动态数组,它提供了在两端高效地插入和删除元素的能力,这使得它非常适合于需要频繁在队列的开始或结尾添加或移除元素的情况。`deque`是`<deque>`头文件中的容器,主要特点包括:
1. **双端访问**:可以从两端(前部或后部)添加或删除元素,这在实现栈、队列等数据结构时非常方便。
2. **随机访问**:内部是一个双向链表,同时维护一个数组,所以可以像数组一样快速随机访问元素,尤其是对于中间位置的元素。
3. **内存分配**:`deque`会在两端自动扩展或收缩,以适应元素的数量变化,而不需要预知元素总数。
使用`deque`的基本步骤如下:
- 包含头文件:`#include <deque>`
- 声明deque实例:`std::deque<T> dequeName;`,其中T是存储元素的类型。
- 创建deque实例:可以指定初始容量,例如`std::deque<int> numbers(10);`
- 插入元素:`dequeName.push_front(value);`(在前部插入)
- `dequeName.push_back(value);`(在后部插入)
- 删除元素:`dequeName.pop_front();`(删除前部元素)
- `dequeName.pop_back();`(删除后部元素)
- 访问元素:`int element = dequeName.front();`(获取前部元素)
- `int element = dequeName.back();`(获取后部元素)
相关问题
c++ deque用法
deque是C++标准库中的容器,它是双端队列(double-ended queue)的缩写。deque允许在两端进行高效地插入和删除操作。以下是deque的用法:
引用中的示例展示了如何使用deque,通过cin从用户输入一系列整数,并将它们添加到deque的尾部,直到输入0为止。最后,打印出deque中存储的数字数量。使用push_back将元素添加到deque的尾部。
引用中的示例展示了如何使用deque的emplace_back函数,它可以在deque的尾部添加元素。emplace_back函数相比push_back函数更高效,因为它可以直接在deque的内存中构造新元素,而不需要创建一个临时对象。
引用中的示例展示了如何使用deque的push_front函数,在deque的前端添加元素。通过push_front函数,可以在deque的前面添加元素。
总结起来,deque是一个双端队列,它可以在两端高效地进行插入和删除操作。可以使用push_back和push_front函数将元素添加到deque的尾部和前面,也可以使用emplace_back函数在deque的尾部添加元素。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [C++ Deque的使用](https://blog.csdn.net/weixin_42587961/article/details/100305841)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
c++实现deque
### C++ 实现 `deque` 数据结构
在 C++ 中,标准模板库(STL)已经提供了高效的双端队列实现——`std::deque`。此容器支持快速的随机访问迭代、常数时间内的前端和后端插入/删除操作。
#### 创建并初始化 `deque`
可以使用多种方法来创建和初始化一个 `deque` 对象:
```cpp
#include <iostream>
#include <deque>
using namespace std;
int main() {
// 初始化 deque 并赋初值
deque<int> d = {1, 2, 3};
// 输出初始状态下的 deque 元素
cout << "Initial elements are: ";
for (auto& elem : d) {
cout << elem << ' ';
}
cout << endl;
}
```
上述代码展示了如何通过列表初始化语法定义一个新的整型 `deque`[^1]。
#### 插入元素到 `deque`
为了向 `deque` 添加新项,可利用成员函数如 `push_back()` 或者更高效的方式是采用 `emplace_*` 方法直接构建对象而无需先创建临时变量再复制或移动它们:
```cpp
void addElements(deque<int>& dq) {
// 使用 push_back/push_front 来添加单个元素
dq.push_back(4);
dq.push_front(-1);
// 利用 emplace 在指定位置构造新元素而非拷贝已有实例
dq.emplace(dq.end(), 5); // 等价于 push_back(5),但在内部调用了构造函数
dq.emplace(dq.begin(), -2); // 类似地,在最前面增加一项
}
// 打印当前 deque 的全部内容
template<typename T>
void printDeque(const deque<T>& deq) {
for (const auto& item : deq){
cout << item << " ";
}
cout << "\n";
}
```
这段程序片段说明了怎样运用不同的插入技术扩展现有的 `deque` 结构体[^3]。
#### 遍历 `deque`
由于 `deque` 支持基于索引的操作,因此可以直接像处理数组那样对其进行遍历;另外也能够借助迭代器完成同样的工作:
```cpp
void traverseByIndex(const deque<int>& dataQueue) {
size_t sz = dataQueue.size();
for(size_t idx = 0 ;idx != sz;++idx){
cout<<dataQueue[idx]<<" ";
}
cout<<"\n";
}
void iterateWithIterator(const deque<int>& iteratedDQ) {
for(auto itr = iteratedDQ.cbegin();itr!=iteratedDQ.cend();++itr){
cout<<*itr<<" ";
}
cout<<"\n";
}
```
这里给出了两种不同风格的遍历模式:一种是指针式的下标访问形式,另一种则是更加泛化的迭代器机制[^2]。
阅读全文