深入探索 C++ 中的 Deque 容器
在 C++ 标准模板库(STL)中,std::deque
(双端队列)是一个非常强大且灵活的容器,它结合了 std::vector
和 std::list
的部分特性,提供了高效的头部和尾部操作,同时支持随机访问。本文将通过一系列示例代码,深入探讨 std::deque
的构造、赋值、插入删除、大小操作、排序以及数据存取等功能。
1. std::deque
的构造方式
std::deque
提供了多种构造方式,可以满足不同的初始化需求。以下是几种常见的构造方式:
1.1 默认构造
cpp复制
deque<int> d1;
d1.push_back(1);
d1.push_front(2);
d1.push_front(8);
这种方式会创建一个空的 deque
,然后通过 push_back
和 push_front
方法动态添加元素。
1.2 通过迭代器构造
cpp复制
deque<int> d2(d1.begin(), d1.end());
这种方式会根据给定的迭代器范围初始化 deque
,d2
将包含 d1
中的所有元素。
1.3 指定大小和初始值构造
cpp复制
deque<int> d3(5, 6);
这种方式会创建一个包含 5 个元素的 deque
,每个元素的初始值为 6。
1.4 拷贝构造
cpp复制
deque<int> d4(d3);
这种方式会创建一个与 d3
内容完全相同的 deque
。
2. std::deque
的赋值操作
std::deque
支持多种赋值方式,包括直接赋值和使用 assign
方法。
2.1 直接赋值
cpp复制
deque<int> d2;
d2 = d1;
这种方式会将 d1
的内容赋值给 d2
,d2
的内容会被替换为 d1
的副本。
2.2 使用 assign
方法
cpp复制
deque<int> d3;
d3.assign(d1.begin(), d1.end());
这种方式会将 d1
的内容赋值给 d3
,与直接赋值类似,但 assign
方法更灵活,可以指定范围。
2.3 指定大小和值赋值
cpp复制
deque<int> d4;
d4.assign(6, 9);
这种方式会将 d4
的大小设置为 6,并将所有元素初始化为 9。
3. 插入与删除操作
std::deque
的一大优势在于它支持高效的头部和尾部操作,同时也可以在中间位置插入或删除元素。
3.1 头插和尾插
cpp复制
d1.push_front(8);
d1.push_back(1);
push_front
和 push_back
分别用于在头部和尾部插入元素。
3.2 头删和尾删
cpp复制
d1.pop_front();
d1.pop_back();
pop_front
和 pop_back
分别用于删除头部和尾部的元素。
3.3 使用 insert
插入
cpp复制
d1.insert(d1.begin(), 0);
d1.insert(d1.begin(), 3, 9);
insert
方法可以在任意位置插入元素,支持单个元素、多个相同元素或范围插入。
3.4 使用 erase
删除
cpp复制
d1.erase(--d1.end());
d1.erase(++d1.begin(), d1.end());
erase
方法可以删除指定位置的元素或范围内的元素。
4. 大小操作
std::deque
提供了一些用于管理大小的方法。
4.1 判空和获取大小
cpp复制
bool ret = d1.empty();
size_t size = d1.size();
empty
方法用于判断 deque
是否为空,size
方法用于获取当前元素的数量。
4.2 调整大小
cpp复制
d1.resize(8, 9);
d1.resize(4);
resize
方法可以调整 deque
的大小,如果新大小大于当前大小,则会用指定值填充新元素;如果新大小小于当前大小,则会截断尾部元素。
5. 排序
std::deque
支持随机访问,因此可以使用标准库中的 std::sort
算法进行排序。
cpp复制
sort(d1.begin(), d1.end());
sort
方法会对 deque
中的元素进行升序排序,也可以通过传入自定义比较函数来实现其他排序方式。
6. 数据存取
std::deque
提供了多种方式来访问数据。
6.1 使用下标访问
cpp复制
cout << d[1] << endl;
通过下标可以直接访问 deque
中的元素,但需要注意越界问题。
6.2 使用 at
方法访问
cpp复制
cout << d.at(1) << endl;
at
方法提供了范围检查,如果访问越界会抛出异常。
6.3 访问首尾元素
cpp复制
cout << d.front() << endl;
cout << d.back() << endl;
front
和 back
方法分别用于访问头部和尾部的元素。
总结
std::deque
是一个功能强大的容器,它结合了 std::vector
和 std::list
的优点,支持高效的头部和尾部操作,同时提供了随机访问的能力。通过本文的介绍,相信你已经对 std::deque
的使用有了更深入的了解。在实际开发中,合理选择容器类型可以大大提高代码的效率和可维护性。希望本文对你有所帮助!