前言
在 C++ 标准库中,容器是数据存储和操作的核心工具,而关联式容器凭借其高效的查找、插入和删除特性,在处理需要快速检索的数据时展现出独特的优势。set、multiset、map 和 multimap 作为 C++ 中常用的关联式容器,底层通常基于红黑树实现,这使得它们在保证数据有序性的同时,能将基本操作的时间复杂度控制在 O(log n) 级别,远超序列式容器在查找操作上的表现。
本文将系统地介绍这几类关联式容器的特性、类模板参数、构造函数及常用接口,深入剖析 set 与 map 在存储模型(k 模型与 k-v 模型)上的差异,以及 multiset、multimap 与对应基础容器在去重特性上的区别。此外,还将通过具体的作业案例,展示这些容器在实际问题中的应用,帮助读者理解如何根据场景选择合适的容器,以及如何高效地运用其接口解决问题。
set
set 的类模板参数声明
set 的构造函数声明
set<int> s;
set 常见的几个接口
operator =,begin,end,rbegin,rend,cbegin,cend,crbegin,crend,empty,size,insert,erase,swap,clear,findlower_bound: 返回的是>=传入值的第一个值upper_bound: 返回的是>传入值的第一个值equal_range: 第一个迭代器返回的是第一个>=val的值的迭代器,第二个迭代器返回的是第一个>val的迭代器,没有的话,就返回end()那个的迭代器count: 返回的是里面值为 val 的个数
注意:
- 没有
operator[] - 传值的话,如果里面没有这个值,是不会报错的;传迭代器,没有这个迭代器,是会报错的
- 查找到的顺序是插入的顺序,而不是插入的顺序,因为插入还会涉及到旋转
multiset
相较于 set 的区别就是,它不会去重而已;其他的接口跟 set 一模一样。
上面的 count 和 equal_range 一般只有 multiset 会用到。
map
相比于 set 其实就是 map 是 k-v 模型,set 是 k 模型。
注意:set 和 multiset 的 iterator 迭代器其实也是 const_iterator 类型的,map 则不是;但是他们都不能修改 key。
map 的类模板参数声明
这里的 Compare 是 key 进去参与比较的。
key 的类型要是不支持比较大小的话,自己要写仿函数。


