深入探索 C++ STL 中的 Deque 容器

深入探索 C++ 中的 Deque 容器

在 C++ 标准模板库(STL)中,std::deque(双端队列)是一个非常强大且灵活的容器,它结合了 std::vectorstd::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_backpush_front 方法动态添加元素。

1.2 通过迭代器构造

cpp复制

deque<int> d2(d1.begin(), d1.end());

这种方式会根据给定的迭代器范围初始化 dequed2 将包含 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 的内容赋值给 d2d2 的内容会被替换为 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_frontpush_back 分别用于在头部和尾部插入元素。

3.2 头删和尾删

cpp复制

d1.pop_front();
d1.pop_back();

pop_frontpop_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;

frontback 方法分别用于访问头部和尾部的元素。

总结

std::deque 是一个功能强大的容器,它结合了 std::vectorstd::list 的优点,支持高效的头部和尾部操作,同时提供了随机访问的能力。通过本文的介绍,相信你已经对 std::deque 的使用有了更深入的了解。在实际开发中,合理选择容器类型可以大大提高代码的效率和可维护性。希望本文对你有所帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值