跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ STL 常用容器入门与使用指南

C++ STL 提供了多种标准容器用于数据存储与管理。内容涵盖 vector 变长数组及其倍增思想、pair 二元组结构、string 字符串操作、queue 队列与 priority_queue 优先队列原理、stack 栈、deque 双端队列以及 set/map 系列有序容器和 unordered 系列哈希表容器的基本用法与时间复杂度分析。重点讲解了各容器的初始化、常用函数及遍历方式,适合初学者快速掌握 C++ 标准库核心数据结构。

忘忧发布于 2026/3/28更新于 2026/6/1526 浏览
C++ STL 常用容器入门与使用指南

C++ STL 常用容器入门

Vector

vector 是支持比较运算的变长数组,按字典序大小排序比较。

倍增思想: 系统为某一程序分配空间时,所需的时间基本上与空间大小无关,与申请次数有关。因此,变长数组要尽量减小申请空间的次数。当空间不够时,将长度 * 2 再次申请。

常用函数:

  • size():返回元素个数
  • empty():返回是否为空
  • clear():清空
  • front()/back():访问首尾元素
  • push_back()/pop_back():尾部插入/弹出
  • begin()/end():迭代器范围
  • []:下标访问

遍历方式: 支持迭代器遍历及 range-based for 循环。

Pair

存储一个二元组,可看成有两个变量的结构体,内部有比较函数定义。

定义方式: 这两个数据类型放什么都行,例如 pair<int, int>。

取出元素方式: 通过 .first 和 .second 访问。

构造一个 pair: 最常用的是存储有两种不同属性的东西。需要按照一种属性来排序时,把需要排序的属性放在 first。 如果有三个属性,也可以用 pair 嵌套,如 pair<int, pair<int, int>> p。

排序规则: 支持比较运算,排序时按字典序来排,以 first 为第一关键字,以 second 为第二关键字。

String

C++ 把字符串进行了封装。

常用函数:

  • size()/length():返回字符串长度
  • empty():判断是否为空
  • clear():清空
  • substr(起始下标,子串长度):返回子串
  • c_str():返回字符串所在字符数组的起始地址

Queue 队列

Priority Queue 优先队列

原理是用堆来实现的,默认是大根堆。

如何构造小根堆:

  1. push() 时直接插入负值。
  2. 定义时就直接定义为小根堆:priority_queue<int, vector<int>, greater<int>> q;

常用函数:

  • size():返回元素个数
  • empty():返回是否为空
  • push():插入一个元素
  • top():返回堆顶元素
  • pop():弹出堆顶元素

Stack 栈

常用函数:

  • size():返回元素个数
  • empty():返回是否为空
  • push():向栈顶插入一个元素
  • top():返回栈顶元素
  • pop():弹出栈顶元素

Deque 双端队列

其实是一个加强版的 vector,功能很强大,但由于时间开销问题,不常用。

常用函数:

  • size(), empty(), clear()
  • front()/back()
  • push_back()/pop_back()
  • push_front()/pop_front()
  • begin()/end()
  • []
  • Set, Multiset

    set 里面不能包含任何重复元素,multiset 里可以有重复元素。

    常用函数:

    • size(), empty(), clear()
    • begin()/end()
    • ++, --:返回前驱和后继,时间复杂度 O(log n)
    • insert():插入一个数
    • find():查找一个数
    • count():返回某一个数的个数
    • erase():删除元素
    • lower_bound()/upper_bound():二分查找

    set 里的所有操作都是 O(log n) 时间复杂度。

    Map, Multimap

    基于平衡二叉树(红黑树),动态维护有序序列。

    常用函数:

    • insert():插入的数是一个 pair
    • erase():输入的参数是 pair 或者迭代器
    • find()
    • []:注意 multimap 不支持此操作
    • lower_bound()/upper_bound()

    时间复杂度是 O(log n)。

    Unordered Set, Map 等

    包括 unordered_set, unordered_map, unordered_multiset, unordered_multimap。

    这些和上面的操作几乎一样,但内部是无序的(因为是不哈希表)。好处就是增删改查复杂度都是 O(1)。 不支持 lower_bound,++,--。

    参考速查表

    // Vector, 变长数组,倍增的思想
    size() 返回元素个数
    empty() 返回是否为空
    clear() 清空
    front()/back() push_back()/pop_back() begin()/end() [] 支持比较运算,按字典序
    
    // Pair<int, int>
    first, 第一个元素
    second, 第二个元素
    支持比较运算,以 first 为第一关键字,以 second 为第二关键字(字典序)
    
    // String,字符串
    size()/length() 返回字符串长度
    empty() clear()
    substr(起始下标,(子串长度)) 返回子串
    c_str() 返回字符串所在字符数组的起始地址
    
    // Queue, 队列
    size() empty() push() 向队尾插入一个元素
    front() 返回队头元素
    back() 返回队尾元素
    pop() 弹出队头元素
    
    // Priority Queue, 优先队列,默认是大根堆
    size() empty() push() 插入一个元素
    top() 返回堆顶元素
    pop() 弹出堆顶元素
    定义成小根堆的方式:priority_queue<int, vector<int>, greater<int>> q;
    
    // Stack, 栈
    size() empty() push() 向栈顶插入一个元素
    top() 返回栈顶元素
    pop() 弹出栈顶元素
    
    // Deque, 双端队列
    size() empty() clear() front()/back() push_back()/pop_back() push_front()/pop_front() begin()/end() []
    
    // Set, Map, Multiset, Multimap, 基于平衡二叉树(红黑树),动态维护有序序列
    size() empty() clear() begin()/end() ++, -- 返回前驱和后继,时间复杂度 O(log n)
    set/multiset insert() 插入一个数 find() 查找一个数 count() 返回某一个数的个数
    erase() (1) 输入是一个数 x,删除所有 x O(k + log n) (2) 输入一个迭代器,删除这个迭代器
    lower_bound()/upper_bound() lower_bound(x) 返回大于等于 x 的最小的数的迭代器 upper_bound(x) 返回大于 x 的最小的数的迭代器
    map/multimap insert() 插入的数是一个 pair erase() 输入的参数是 pair 或者迭代器 find() [] 注意 multimap 不支持此操作。时间复杂度是 O(log n)
    
    // Unordered Set, Unordered Map, Unordered Multiset, Unordered Multimap, 哈希表
    和上面类似,增删改查的时间复杂度是 O(1)
    不支持 lower_bound()/upper_bound(),迭代器的++, --
    
    // Bitset, 压位
    bitset<10000> s;
    ~, &, |, ^ >>, << ==, != []
    count() 返回有多少个 1
    any() 判断是否至少有一个 1
    none() 判断是否全为 0
    set() 把所有位置成 1
    set(k, v) 将第 k 位变成 v
    reset() 把所有位变成 0
    flip() 等价于~ flip(k) 把第 k 位取反
    

    目录

    1. C++ STL 常用容器入门
    2. Vector
    3. Pair
    4. String
    5. Queue 队列
    6. Priority Queue 优先队列
    7. Stack 栈
    8. Deque 双端队列
    9. Set, Multiset
    10. Map, Multimap
    11. Unordered Set, Map 等
    12. 参考速查表
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • C++ STL 常用容器详解与实战技巧
    • C++ STL 常用容器核心用法解析
    • C++ STL 常用容器实战指南
    • C++ STL 常用容器核心用法与性能解析
    • EgoPoseFormer v2:解决 AR/VR 场景中的第一视角人体动捕问题
    • 视觉语言模型(VLM)综述:An Introduction to VLM
    • C++ STL 常用容器详解与实战技巧
    • Mac 虚拟机搭建 Keil5 STM32 开发环境及 ST-Link 驱动问题排查
    • Python 初学者常用编程代码示例与基础语法详解
    • Java GUI 组件详解:下拉菜单与弹出菜单
    • RxJava 迁移至 Kotlin Flow 的背压策略对比与实现
    • Python 初学者必备开发环境搭建指南
    • C++ 二叉搜索树原理与增删查实现
    • Linux 网络基础——协议与网络传输基本原理
    • Git for Windows 安装与配置详解
    • WSL 环境下 Neo4j 连接失败排查与修复指南
    • C++ 二叉搜索树原理与增删查操作实现
    • C++ 二叉搜索树:原理与增删查实现详解
    • C++ 二叉搜索树原理与增删查实现详解
    • Flutter jwt_io 鸿蒙适配指南:JWT 加解密与身份验证

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

    • Markdown转HTML

      将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

    • HTML转Markdown

      将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online