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

C++ STL 常用容器详解:Vector、Pair 到 Map 实战

C++ STL 标准模板库提供了丰富的容器类型,本文系统梳理了 vector、pair、string、队列、栈、集合及映射等核心容器的特性与用法。重点解析了变长数组的动态扩容机制、优先队列的堆实现原理、有序容器与无序哈希表的时间复杂度差异。通过对比 set/map 基于红黑树的 O(logn) 操作与 unordered 系列的 O(1) 性能,帮助开发者根据场景选择合适的容器结构,提升代码效率。

信号故障发布于 2026/3/15更新于 2026/8/1941 浏览
C++ STL 常用容器详解:Vector、Pair 到 Map 实战

C++ STL 常用容器详解

前言

C++ 标准模板库(STL)提供了丰富的容器类型,合理使用它们能显著提升开发效率。本文将系统梳理 vector、pair、string、队列、栈、集合及映射等核心容器的特性与用法,重点解析动态扩容机制、堆实现原理以及不同容器在时间复杂度上的差异。

Vector:变长数组与倍增思想

vector 是支持比较运算的序列容器,按字典序大小排序。其底层采用连续内存空间存储元素。

内存分配策略

系统为程序分配空间时,所需时间主要与申请次数有关,而非空间大小。例如,申请一个大小为 1000 的数组,比申请 1000 个大小为 1 的数组快得多。因此,使用变长数组时应尽量减少空间申请的次数。

当 vector 容量不足时,通常会将长度翻倍再次申请内存。这种倍增策略保证了均摊时间复杂度为 O(1)。

常用操作

  • size(): 返回元素个数
  • empty(): 判断是否为空
  • clear(): 清空容器
  • front()/back(): 访问首尾元素
  • push_back()/pop_back(): 尾部插入/弹出
  • begin()/end(): 迭代器遍历
  • []: 下标访问,支持比较运算
#include <vector>
#include <iostream>
using namespace std;

int main() {
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    // 访问第一个元素
    cout << v.front() << endl;
    return 0;
}

Pair:二元组结构

pair 可以看作有两个变量的结构体,内部已定义比较函数。它常用于存储具有两种属性的数据。

定义与取值

#include <utility>
pair<int, int> p = make_pair(1, 2);

pair<, > p{, };

 first = p.first;   
 second = p.second; 
// 或
int
int
1
2
int
// 第一个元素
int
// 第二个元素

排序规则

pair 支持比较运算,排序时按字典序进行:以 first 为第一关键字,second 为第二关键字。若需存储三个属性,可嵌套使用,如 pair<int, pair<int, int>>。

String:字符串封装

C++ 对字符串进行了面向对象封装,提供了便捷的接口。

  • size()/length(): 返回字符串长度
  • substr(起始下标,子串长度): 截取子串
  • c_str(): 返回 C 风格字符串指针

线性容器:Queue、Stack、Deque

Queue 队列

遵循先进先出(FIFO)原则。

  • push(): 向队尾插入
  • pop(): 弹出队头
  • front()/back(): 访问队头/队尾

Stack 栈

遵循后进先出(LIFO)原则。

  • push(): 向栈顶插入
  • pop(): 弹出栈顶
  • top(): 返回栈顶元素

Deque 双端队列

deque 是加强版的 vector,支持两端高效插入和删除。虽然功能强大,但在某些极端场景下性能略逊于 vector,实际使用中需根据需求权衡。

Priority Queue:优先队列

优先队列默认是大根堆,即每次弹出的都是当前最大值。其底层通常由 vector 和 heap 算法实现。

构造小根堆

若需要小根堆(每次弹出最小值),有两种常见方式:

  1. 插入时直接存入负值。
  2. 定义时指定比较函数:
#include <queue>
#include <functional>

// 方法二:使用 greater 定义小根堆
priority_queue<int, vector<int>, greater<int>> q;

Set 与 Map:有序关联容器

set、multiset、map、multimap 基于平衡二叉树(红黑树)实现,动态维护有序序列。

  • 时间复杂度:所有操作均为 O(log n)
  • 去重性:set/map 不允许重复键,multiset/multimap 允许
  • 迭代器:支持 ++/-- 返回前驱和后继
  • 查找:lower_bound(x) 返回大于等于 x 的最小元素迭代器;upper_bound(x) 返回大于 x 的最小元素迭代器
#include <map>
map<int, string> m;
m.insert({1, "one"});
// 查找
auto it = m.find(1);
if (it != m.end()) {
    cout << it->second << endl;
}

Unordered 系列:哈希表容器

unordered_set、unordered_map 等基于哈希表实现。

  • 优势:增删改查平均时间复杂度为 O(1)
  • 劣势:不支持 lower_bound/upper_bound,迭代器不支持 ++/-- 顺序遍历
  • 适用场景:对顺序无要求,追求极致查询速度时

常用 API 速查表

容器关键函数说明
Vectorpush_back, pop_back, size变长数组,随机访问
Pairfirst, second二元组,字典序比较
Stringsubstr, c_str字符串处理
Queuepush, pop, front队列,FIFO
Priority_Queuetop, push, pop堆,默认大根堆
Stackpush, pop, top栈,LIFO
Set/Mapinsert, find, erase红黑树,O(log n)
Unorderedinsert, find哈希表,O(1)

掌握这些容器的特性,能帮助你在图论、动态规划等算法场景中做出更优的数据结构设计选择。

目录

  1. C++ STL 常用容器详解
  2. 前言
  3. Vector:变长数组与倍增思想
  4. 内存分配策略
  5. 常用操作
  6. Pair:二元组结构
  7. 定义与取值
  8. 排序规则
  9. String:字符串封装
  10. 线性容器:Queue、Stack、Deque
  11. Queue 队列
  12. Stack 栈
  13. Deque 双端队列
  14. Priority Queue:优先队列
  15. 构造小根堆
  16. Set 与 Map:有序关联容器
  17. Unordered 系列:哈希表容器
  18. 常用 API 速查表
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 如何快速部署 OpenAI Whisper:离线语音转文字指南
  • FLUX.1 AI 绘画镜像免配置部署:内置中文界面与双语 Web UI
  • Java 注解与反射实战:自定义日志与参数校验注解实现
  • OpenClaw 在 Windows 与 macOS 上的安装体验对比
  • Java 常见异常排查与修复实战指南
  • C++ 红黑树实现详解:STL map 底层数据结构解析
  • 掌握 Python 可从事的七大技术岗位及发展建议
  • Whisper v0.2 本地语音转文字工具安装与使用指南
  • FLUX.1-dev 本地部署与 Midjourney 迁移指南及 Prompt 工程适配
  • 基于混元 AIGC 与腾讯云智能体构建文思通智能写作助手
  • 高精度混凝土缺陷与桥梁病害巡检数据集(YOLO 格式)
  • 华为 OD 算法题解:优雅子数组
  • 算法实战:预处理、滑窗、前缀和哈希及图论并查集应用
  • Android WebView 内核升级方案详解
  • MySQL 主从集群原理及 Docker 实战部署
  • Spring 日志模块 Spring-Jcl 详解与 Log4j 集成案例
  • OpenClaw 对接 QQ 机器人:本地及腾讯云部署方案
  • WebSocket 与 WebRTC 实时通信技术详解及项目实战
  • SpringBoot 集成 KingbaseES 数据库实践指南
  • Dify 开源 LLM 应用开发平台核心功能与架构解析

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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