第一节 · 取之不竭 · 顺序容器

在第一弹中,我们学习了 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;
}

dequevector 的区别:

  • vector:只在尾部高效增删

  • deque:在头部和尾部都高效增删

  • deque 的内存不连续,但支持随机访问


list:双向链表

list 是双向链表,在任意位置插入和删除都很高效,但不支持随机访问:

list 的特有操作:


forward_list:单向链表

forward_list 是单向链表,比 list 更节省内存:


容器的通用操作

所有顺序容器都支持以下操作:


容器适配器

除了基本容器,标准库还提供了容器适配器,它们基于其他容器实现特定的数据结构:

stack:栈(后进先出)

queue:队列(先进先出)

priority_queue:优先队列(堆)


如何选择容器

  • 需要随机访问:vectordequearray

  • 在中间频繁插入删除:listforward_list

  • 在两端频繁操作:deque

  • 大小固定:array

  • 存储字符:string

  • 后进先出:stack

  • 先进先出:queue

  • 按优先级处理:priority_queue

默认情况下,优先选择 vector,除非有特殊需求。


习题

  • 使用 deque 实现一个简单的撤销/重做功能。

  • 使用 list 实现约瑟夫环问题。

  • 比较 vectorlist 在中间位置插入大量元素的性能差异。

Last updated