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

C++ STL 常用容器实战指南

综述由AI生成C++ STL 涵盖了 vector、string、map 等核心容器。本文详解 vector 的倍增扩容机制、pair 的结构化存储、优先队列的堆实现原理,以及有序与无序容器的复杂度差异。通过实际代码示例,帮助开发者掌握常用函数的调用时机与性能特征,为算法竞赛或工程开发打下基础。

晚风告白发布于 2026/3/26更新于 2026/6/1220 浏览
C++ STL 常用容器实战指南

C++ STL 常用容器实战指南

STL(Standard Template Library)是 C++ 标准库的核心组成部分,提供了丰富的数据结构与算法。掌握这些容器不仅能提升开发效率,更是理解底层内存管理与性能优化的关键。

Vector:动态数组的倍增策略

vector 是最常用的序列容器,底层基于连续内存空间。它的核心优势在于支持随机访问,但扩容机制需要特别注意。

为什么会有倍增思想? 系统分配内存的时间主要取决于申请次数而非总大小。如果频繁申请小块内存,开销巨大。因此 vector 在容量不足时通常采用倍增策略(例如容量翻倍),这样均摊下来插入操作的复杂度接近 O(1)。

#include <iostream>
#include <vector>

int main() {
    std::vector<int> v;
    // 预分配空间可以减少扩容次数
    v.reserve(1000); 
    for (int i = 0; i < 1000; ++i) {
        v.push_back(i);
    }
    return 0;
}

常用操作:

  • size() / empty():获取元素个数或判断是否为空。
  • push_back() / pop_back():尾部增删。
  • front() / back():访问首尾元素。
  • begin() / end():迭代器遍历。
  • []:支持下标访问,且 vector 整体支持字典序比较运算。

Pair:二元组结构体

pair 可以看作是一个包含两个变量的结构体,常用于存储关联数据(如坐标、键值对)。它内部定义了比较运算符,排序时默认以 first 为第一关键字,second 为第二关键字进行字典序比较。

#include <utility>
#include <algorithm>

std::pair<int, int> p = {1, 2};
// 嵌套 pair 处理多属性
std::pair<int, std::pair<int, int>> complex_p = {1, {2, 3}};

使用场景: 当某个对象具有两种不同属性,且需要按其中一种属性排序时,pair 非常高效。例如在图论中存储边权与节点索引。

String:字符串封装

C++ 将字符串进行了面向对象封装,比 C 风格字符数组更安全便捷。

#include <string>

std::string s = "hello";
s.substr(0, 3); // 获取子串 "hel"
const char* c_str_ptr = s.c_str(); // 获取 C 风格指针

序列容器:队列与栈

Queue & Stack

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

#include <queue>
#include <stack>

std::queue<int> q;
q.push(1);      // 入队
int head = q.front(); // 取头
q.pop();        // 出队

std::stack<int> st;
st.push(1);     // 入栈
int top = st.top(); // 取顶
st.pop();       // 出栈

Priority Queue:优先队列

底层基于堆实现,默认是大根堆。若需小根堆,可指定比较函数。

#include <queue>
#include <functional>

// 大根堆(默认)
std::priority_queue<int> pq_max;

// 小根堆
std::priority_queue<int, std::vector<int>, std::greater<int>> pq_min;

Deque:双端队列

功能类似加强版 vector,支持两端高效插入删除,但时间开销略高于 vector,视场景选用。

关联容器:有序与无序

Set & Map

基于平衡二叉树(红黑树)实现,维护有序序列。所有操作时间复杂度为 O(log n)。

  • insert():插入元素。
  • find() / count():查找与计数。
  • erase():删除元素。
  • lower_bound() / upper_bound():二分查找边界。

注意:multiset/multimap 允许重复元素,而 set/map 不允许。

Unordered 系列

基于哈希表实现,增删改查平均复杂度为 O(1)。但失去了有序性,不支持 lower_bound 及迭代器的自增自减操作。

#include <unordered_map>

std::unordered_map<int, int> umap;
umap[1] = 10; // O(1)

Bitset:位运算优化

适用于状态压缩或大量布尔值存储。

#include <bitset>

std::bitset<10000> bs;
bs.set(k, v);   // 第 k 位设为 v
bs.flip();      // 全部取反
bs.count();     // 统计 1 的个数

总结 选择容器时需权衡时间与空间。追求有序查询用 map/set,追求极致速度用 unordered,频繁尾部操作首选 vector。理解底层原理,才能在工程实践中做出最优决策。

目录

  1. C++ STL 常用容器实战指南
  2. Vector:动态数组的倍增策略
  3. Pair:二元组结构体
  4. String:字符串封装
  5. 序列容器:队列与栈
  6. Queue & Stack
  7. Priority Queue:优先队列
  8. Deque:双端队列
  9. 关联容器:有序与无序
  10. Set & Map
  11. Unordered 系列
  12. Bitset:位运算优化
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • 东方通 TongLINK/Q 与华为 RabbitMQ 国产化运维核心技术解析
  • Python CAD 数据处理实战:DXF 解析与 3D 建模全流程
  • GitHub 核心概念与开发协作指南
  • Ubuntu 20.04/22.04 使用 NVM 安装 Node.js 22 LTS 版本
  • Milvus 索引实战:类型选型与 Python 代码示例
  • Seedance 2.0 飞书机器人深度集成:API 鉴权与上下文感知对话配置
  • AI 编程助手深度对比:OpenCode、Claude Code 与 Kimi Code CLI
  • OpenClaw 技能扩展实战:Tavily 联网与多维表格自动化
  • 基于强化学习Q-learning的无人机三维路径规划原理与MATLAB实现
  • Java 17与Spring AI深度解析:RAG架构与Agent智能体
  • Java 实现百度地图 SN 权限签名及搜索接口调用实战
  • JavaScript reduce 方法核心原理与实战应用
  • JDK9 及以上版本适配 wsimport 生成的 SOAP 代码
  • Revit 模型 Web 可视化:Revit2GLTF 转换方案详解
  • 零基础转行学习 Python 的指南与建议
  • 基于 QNN 框架在 Android 端部署 LLaMA-7B 大模型实战
  • 微软 Edge Webview2 v144 升级致 SAP GUI 白屏故障及修复方案
  • Prompt 设计原则与技巧:构建高效指令的方法论
  • 千笔 AI 辅助论文写作工具功能解析
  • Unity+AI 使用自然语言制作小游戏:飞翔的牛马

相关免费在线工具

  • 加密/解密文本

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