关联容器中的元素是按关键字来保存和访问的
两个主要的关联容器类型是 map 和 set。map 中的一个关键字-值(key - value)对:关键字起到索引作用,值则表示与索引相关联的数据。set 中每个元素只包含一个关键字;
以下八个容器间的不同体现在三个维度上:
(1):是一个 set 或者是一个 map
(2):要求不重复关键字或允许重复关键字,允许重复的名字以 multi 开头
(3):按顺序保存元素,或无序保存 不保持关键字按顺序存储的容器的名字以 unordered 开头
关联容器的迭代器都是双向的
当定义一个 map 时,必须既指明关键字类型又指明值类型。而定义一个 set 时,只需要指明关键字类型,因为 set 中没有值
每个关联容器都定义了一个默认构造函数,它创建了一个指定类型的空容器,,我们也可以将关联容器初始化为另一个通类型容器的拷贝,或是从一个值范围来初始化关联容器,只要这些值可以转化
对关联容器进行初始化:
对于有序容器---map,multimap,set 以及 multiset ,关键字类型必须元素比较的方法
默认情况下,标准库使用关键字类型的 < 运算符来比较两个关键字
在集合类型中,关键字类型就是元素类型,在映射类型中,关键字类型是元素的第一部分的类型
pair 的数据成员是 public 的,两个成员分别命名为 first 和 second
当解引用一个关联容器迭代器时,得到一个类型为容器的 value_type 的值的引用
对 map 来说,value_type 是一个pair 类型,其 first 成员保存 const 的关键字,second 成员保存值
set 的迭代器是 const 的
map 和 set 类型都支持 begin 和 end 操作,可以用这些函数获取迭代器,然后用迭代器来遍历容器
对于 map 和 set (以及对应的无序类型)包含保护不重复的关键字,因此插入一个已存在的元素对容器没有影响
map 和 unordered_map 容器提供了下标运算符和一个对应的 at 函数
map 下标运算符接受一个索引(即一个关键字),获取与此关键字相关联的值。不同的是:如果关键字并不在 map 中,会为它创建一个元素并插入到 map 中,关联值将进行值初始化
由于下标运算符可能插入一个新元素,我们只可以对非 const 的 map 使用下标操作
另一个不同之处是返回类型
通常情况下,解引用一个迭代器所返回的类型与下标运算符返回的类型是一样的。但对 map 则不然,当对一个 map 进行下标操作时,会获得一个 mapped_type 对象(每个关键字关联的类型),当解引用一个 map 迭代器时,会得到一个 value_type 对(pair
如果不需要计数,最好使用 find
如果一个 multimap 或 multiset 中有多个元素具有给定关键字,则这些元素在容器中会相邻存储
此函数接受一个关键字,返回一个迭代器 pair 。若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置。若未找到匹配元素,则两个迭代器都指向关键字可以插入的位置
无序关联容器不是使用比较运算符来组织元素,而是使用一个 哈希函数 和关键字类型的 ==运算符
我们不能直接定义关键字类型为自定义类类型的无序容器。与容器不同,不能直接使用哈希模板,而必须提供我们自己的 hash 模板版本