第一节 · 取之不竭 · 顺序容器
在第一弹中,我们学习了 vector——一种动态数组。实际上,C++ 标准库提供了多种顺序容器,它们都用于存储和管理元素序列,但各有特点。
选择合适的容器,就像选择合适的工具——虽然锤子和扳手都能敲东西,但各有各的最佳使用场景。
顺序容器概览
vector
动态数组
随机访问快,尾部增删快
deque
双端队列
随机访问快,两端增删快
list
双向链表
任意位置增删快,不支持随机访问
forward_list
单向链表
内存紧凑,只能单向遍历
array
固定数组
大小固定,性能最优
string
字符串
专门用于存储字符
deque:双端队列
deque(double-ended queue)在两端都可以高效地添加或删除元素:
#include <deque>
#include <iostream>
using namespace std;
int main()
{
deque<int> d;
// 在两端添加元素
d.push_back(1);
d.push_back(2);
d.push_front(0);
d.push_front(-1);
// d: -1, 0, 1, 2
// 在两端删除元素
d.pop_front();
d.pop_back();
// d: 0, 1
// 支持随机访问
cout << d[0] << endl; // 0
cout << d.at(1) << endl; // 1
// 遍历
for (int x : d)
cout << x << " ";
cout << endl;
return 0;
}deque 与 vector 的区别:
vector:只在尾部高效增删deque:在头部和尾部都高效增删deque的内存不连续,但支持随机访问
list:双向链表
list 是双向链表,在任意位置插入和删除都很高效,但不支持随机访问:
list 的特有操作:
forward_list:单向链表
forward_list 是单向链表,比 list 更节省内存:
容器的通用操作
所有顺序容器都支持以下操作:
容器适配器
除了基本容器,标准库还提供了容器适配器,它们基于其他容器实现特定的数据结构:
stack:栈(后进先出)
queue:队列(先进先出)
priority_queue:优先队列(堆)
如何选择容器
需要随机访问:
vector、deque、array在中间频繁插入删除:
list、forward_list在两端频繁操作:
deque大小固定:
array存储字符:
string后进先出:
stack先进先出:
queue按优先级处理:
priority_queue
默认情况下,优先选择 vector,除非有特殊需求。
习题
使用
deque实现一个简单的撤销/重做功能。使用
list实现约瑟夫环问题。比较
vector、list在中间位置插入大量元素的性能差异。
Last updated