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

C++ STL 容器详解:map 与 set 的基本使用及底层原理

C++ STL 包含序列式容器和关联式容器。关联式容器如 map 和 set 基于红黑树实现,提供 O(logN) 的增删查效率。set 用于 key 搜索场景,map 用于 key/value 搜索。set 存储唯一键值,multiset 允许重复。通过迭代器可遍历有序数据。常用接口包括构造、insert、find、count、erase 等。掌握这些基础操作有助于高效处理数据结构问题。

落日余晖发布于 2026/3/29更新于 2026/9/679 浏览
C++ STL 容器详解:map 与 set 的基本使用及底层原理

序列式容器和关联式容器

前面我们已经接触过 STL 中的部分容器如:string、vector、list、deque、array、forward_list 等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间一般没有紧密的关联关系,比如交换一下,它依旧是序列式容器。顺序容器中的元素是按它们在容器中的存储位置来顺序保存和访问的。

关联式容器也是用来存储数据的,与序列式容器不同的是,关联式容器逻辑结构通常是非线性结构,两个位置有紧密的关联关系,交换一下,它的存储结构就被破坏了。顺序容器中的元素是按关键字来保存和访问的。关联式容器有 map/set 系列和 unordered_map/unordered_set 系列。本章节讲解的 map 和 set 底层是红黑树,红黑树是一颗平衡二叉搜索树。set 是 key 搜索场景的结构,map 是 key/value 搜索场景的结构。

set 系列的使用

set 和 multiset 参考文档

set 类的介绍

set 的声明如下,T 就是 set 底层关键字的类型。set 默认要求 T 支持小于比较,如果不支持或者想按自己的需求走可以自行实现仿函数传给第二个模板参数。set 底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。一般情况下,我们都不需要传后两个模板参数。set 底层是用红黑树实现,增删查效率是 O(logN),迭代器遍历是走的搜索树的中序,所以是有序的。前面部分我们已经学习了 vector/list 等容器的使用,STL 容器接口设计,高度相似,所以我们就不再一个接口一个接口的介绍,而是直接带着大家看文档,挑比较重要的接口进行介绍。默认是小堆,想要大堆修改第二个参数,就是仿函数。

template < class T, // set::key_type/value_type 
            class Compare = less<T>, // set::key_compare/value_compare 仿函数 
            class Alloc = allocator<T> // set::allocator_type 
           > 
class set;

insert 和迭代器遍历使用样例

有重复的值,会被去除。

可以看到,如果有 2 个 5,有一个 5 会被去除。

insert duplicate

插入一段 initializer_list 列表值,如果已经存在了,这个值就不会插入。

initializer list

遍历 string,是比较 ASCII 码大小顺序遍历的。

string traversal

set 的构造和迭代器

set 的构造我们关注以下几个接口即可。

set 的支持正向和反向迭代遍历,遍历默认按升序顺序,因为底层是二叉搜索树,迭代器遍历走的中序;支持迭代器就意味着支持范围 for,set 的 iterator 和 const_iterator 都不支持迭代器修改数据,修改关键字数据,破坏了底层搜索树的结构。

// empty (1) 无参默认构造
explicit set (const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());
// range (2) 迭代器区间构造
template <class InputIterator> 
set (InputIterator first, InputIterator last, const key_compare& comp = key_compare(), const allocator_type& = allocator_type());

range construct

// copy (3) 拷贝构造
set (const set& x);
// initializer list (5) initializer 列表构造
set (initializer_list<value_type> il, const key_compare& comp = key_compare(), const allocator_type& alloc = allocator_type());

initializer construct

// 迭代器是一个双向迭代器
iterator -> a bidirectional iterator to const value_type
// 正向迭代器
iterator begin(); 
iterator end(); 
// 反向迭代器
reverse_iterator rbegin(); 
reverse_iterator rend();

iterators r iterators

set 的增删查

set 的增删查关注以下几个接口即可:

Member types
key_type -> The first template parameter (T)
value_type -> The first template parameter (T)
// 单个数据插入,如果已存在则插入失败
pair<iterator,bool> insert (const value_type& val); 
// 列表插入,已在容器中的值不会插入
void insert (initializer_list<value_type> il); 
// 迭代器区间插入,已在容器中的值不会插入
template <class InputIterator> 
void insert (InputIterator first, InputIterator last);

insert sample

// 查找 val,返回 val 所在的迭代器,未找到返回 end()
iterator find (const value_type& val); 
// 查找 val,返回 val 的个数
size_type count (const value_type& val) const;

find sample

未找到返回 end(),end() 指向最后一个元素之后。

end pointer

count 查找数值,存在就返回 1,不存在返回 0。

count sample

目录

  1. 序列式容器和关联式容器
  2. set 系列的使用
  3. set 类的介绍
  4. insert 和迭代器遍历使用样例
  5. set 的构造和迭代器
  6. set 的增删查

更多推荐文章

查看全部
  • 九么 1.0.31:AI 辅助 Python 数据处理实战
  • CSS3 十六进制透明度用法详解与实战技巧
  • Web-Check 结合 cpolar 实现远程网站安全检测
  • 2026 年春晚 AI 应用解析与普通人技术风口应对策略
  • Ubuntu 24.04 深度学习环境配置:NVIDIA 驱动与 CUDA 安装验证
  • Linux 手动部署并测试内网穿透
  • OpenClaw 爆红启示:AI 助手如何改写开源规则
  • LocalAI 本地推理引擎:不用 GPU 也能跑大模型
  • FunASR 离线文件转写服务开发与部署实战
  • 微信群智能管理:扣子机器人接入实战
  • SBUS 协议原理与实战:无人机航模机器人通信方案
  • 统一 API 接口下的多模型接入与成本优化方案
  • AIGC 产品经理的定义、职责及与 AI 产品经理的区别
  • Soft Actor-Critic (SAC) 算法详解与 PyTorch 实现
  • Web 自动化测试实战:常用函数全解析与场景化应用
  • C 语言快速排序详解与多种优化变式
  • WhisperX 快速上手指南:基于 OpenAI Whisper 的语音识别工具
  • STL map 与 multimap 核心特性及接口详解
  • OpenClaw 跨平台安装指南:Windows 与 Ubuntu
  • Java RESTful 接口开发实战指南

相关免费在线工具

  • 加密/解密文本

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