目录

C第十节map和set的介绍与使用

C++第十节:map和set的介绍与使用

https://i-blog.csdnimg.cn/direct/bcf2f3ae1c4d4dc2b6c4d79e7f9b568a.gif

【本节要点】

  • 1.关联式容器
  • 2.键值对
  • 3.map介绍与使用
  • 4.set介绍与使用
  • 5.multimap与multisedd的介绍与使用

一、关联式容器:数据管理的核心利器

关联式容器是STL中用于高效存储和检索键值对(key-value pair) 的数据结构,其底层基于 红黑树(Red-Black Tree)实现,具备以下特性:

  • 有序性 :元素按**键(key)**自动排序(默认升序)。
  • 对数时间复杂度 :插入、删除、查找操作均为 O(logN)
  • 键的唯一性 (仅Map和Set):每个键唯一存在,Multimap和Multiset允许重复键。

应用场景

  • 数据库索引(如MySQL的B+树索引)
  • 配置参数映射(如INI文件解析)
  • 单词频次统计
  • 唯一元素集合管理

二、键值对(Key-Value Pair)

概念 键值对是关联式容器的核心单元,通过 键(Key)快速定位值(Value) ,适用于“一对一”或“一对多”映射场景。

SGI-STL中关于键值对的定义:

template <class T1, class T2>
struct pair
{
    typedef T1 first_type;
    typedef T2 second_type;
    T1 first;
    T2 second;
    pair(): first(T1()), second(T2())
    {}
    pair(const T1& a, const T2& b): first(a), second(b)
    {}
};

三、Map:高效键值映射

3.1 核心特性

  • 唯一键 :每个键只能对应一个值。
  • 自动排序 :元素按键升序存储(可自定义比较函数)。

3.2 map的构造

https://i-blog.csdnimg.cn/direct/2b1db0e401214fc89f9e5dd7ff07824a.png

3.3 map的迭代器

https://i-blog.csdnimg.cn/direct/775de12ca8da48fa8e4fc5f083919c29.png

3.4 map的容量与元素访问

https://i-blog.csdnimg.cn/direct/f194ea15bc5d43e6943d4f83e56d8311.png

3.5. map中元素的修改

https://i-blog.csdnimg.cn/direct/15b366f1ef6c4286a58285fb105358a6.png

3.6 map小结

    1. map中的的元素是键值对
    1. map中的key是唯一的,并且不能修改
    1. 默认按照小于的方式对key进行比较
    1. map中的元素如果用迭代器去遍历,可以得到一个有序的序列
    1. map的底层为平衡搜索树(红黑树),查找效率比较高$O(log_2 N)$
    1. 支持[]操作符,operator[]中实际进行插入查找。

四、Set:唯一元素集合

4.1 核心特性

  • 元素即键 :存储不重复的元素,仅支持按值查找。
  • 自动去重 :插入重复元素无效。

4.2 set的构造

https://i-blog.csdnimg.cn/direct/fcbb6775b0944fd5924a436cdbdf94be.png

4.3 set的迭代器

https://i-blog.csdnimg.cn/direct/b74bbed579804be6842a54738cc4c157.png

4.4 set的容量

https://i-blog.csdnimg.cn/direct/9007c0d6ccea4fb184fea0481a1d314b.png

4.5 set修改操作

https://i-blog.csdnimg.cn/direct/ea80d545b6074e0ca42dbd151b38cd5d.png

4.6 应用场景

  • 用户ID去重
  • 集合运算(如set_intersection、set_union)

五、Multimap与Multiset:支持重复键的扩展容器

容器键是否唯一值是否唯一适用场景
Multimap邮件地址分组、学生课程映射
Multiset单词频次统计、学生成绩排名
容器插入/删除查找键是否唯一是否允许修改键适用场景
MapO(logN)O(logN)需要键值映射的场景
SetO(logN)O(logN)唯一元素集合管理
MultimapO(logN)O(logN)一对多映射(如用户-角色)
MultisetO(logN)O(logN)允许重复的统计场景

选型建议

  • 若需 键值映射键唯一 ,优先选择Map。
  • 若仅需 存储唯一元素 ,使用Set。
  • 若存在 一对多关系 ,选用Multimap(如用户-邮件地址)。

六、总结

Map和Set作为基于红黑树的关联式容器,提供了平衡的时间复杂度和有序性保障,适用于需要高效查找和唯一性管理的场景。开发者需根据实际需求权衡有序性、唯一性及性能因素,灵活选择容器类型(Map vs unordered_map、Set vs Multiset),并合理使用API以避免潜在陷阱(如下标操作副作用)。深入理解其底层原理,有助于在复杂系统中设计高效的数据结构。


以上就是关于 树型结 构的关联式容器主总结 ,如果有发现问题的小伙伴,请在评论区说出来哦。 后面还会持续更新C++相关知识,感兴趣请持续关注我哦!!

https://i-blog.csdnimg.cn/direct/f41e3de4f3504faf88d114bb472e024a.gif