一、关联容器中的元素是按关键字来保存和访问的
二、有2个主要的关联容器map和set
三、map中的元素是一些关键字-值(key-value)对,关键字起到索引的作用,值则表示与索引相关联的数据
四、set中每个元素包含一个关键字
五、标准库提供8个关联容器,体现在3个维度上:
1、每个容器或者是一个set,或者是一个map
2、或者要求不重复的关键字,或者允许重复的关键字
3、按顺序保存元素,或者无序保存
六、允许重复关键字的容器名字中都包含单词multi
七、不保持关键字按顺序存储的容器的名字都以单词unordered开头
八、关联容器类型
有序集合 | |
map | |
set | |
multimap | 关键字可重复 |
multiset | 关键字可重复 |
无序集合 | |
unordered_map | 用哈希函数组织 |
unordered_set | 用哈希函数组织 |
unordered_multimap | 用哈希函数组织,关键字可重复 |
unordered_multiset | 用哈希函数组织,关键字可重复 |
九、关联容器不支持顺序容器的位置相关操作,也不支持构造函数或插入操作这些接受一个元素值和一个数量值的操作
十、关联容器的迭代器都是双向的
十一、对于有序容器:map、multimap、set、multiset,关键字类型必须定义元素比较的方法
十二、pair保存2个数据成员
十三、关联容器关键字和值类型
key_type | 此容器类型的关键字类型 |
mapped_type | 每个关键字关联的类型,只适用于map |
value_type | 对于set,与key_type相同 对于map,为pair<const key_type, mapped_type> |
十四、由于不能改变一个元素的关键字,所以pair的关键字部分是const的,set的关键字也是const的
十五、当解引用一个关联容器迭代器时,会得到一个类型为容器的value_type的值的引用,对于map,value_type时一个pair类型,其first成员保存const的关键字,second成员保存值
十六、通常不对关联容器使用泛型算法
十七、关联容器的insert成员向容器中添加一个元素或一个元素范围,由于map和set包含不重复关键字,因此插入一个已存在的元素对容器没有影响
十八、map和unordered_map容器提供了下标运算和at函数
十九、如果关键字不在map中,会为它创建一个元素插入到马匹中,关联值将进行值初始化
二十、由于下标运算符可能插入一个新元素,值可以对非const的map使用下标操作
二一、当对一个map进行下标操作时,会得到一个mapped_type对象,但解引用一个map时,会得到一个value_type对象
二二、如果只想直到一个给定关键字是否在map中,而不想改变map,应该使用find
二三、如果一个multimap或multiset中有多个元素具有给定关键字,则它们在容器中会相邻存储
二四、如果关键字在容器中,lower_bound返回的迭代器指向第一个具有给定关键字的元素,upper_bound返回的迭代器指向最后一个具有给定关键字的元素,因此,用相同关键字调用lower_bound和upper_bound会得到一个迭代器范围,表示所有具有该关键字的元素的范围
二五、如果没有元素与给定关键字匹配,lower_bound和upper_bound会返回相等的迭代器:都指向给定关键字的插入点,能保持容器中元素顺序的插入
二六、equal_range返回一个迭代器pair,若关键字存在,则第一个迭代器指向第一个与关键字匹配的元素,第二个迭代器指向最后一个匹配元素之后的位置,如果没找到匹配元素,则2个迭代器都指向关键字可插入的位置
二七、新标准定义了4个无序关联容器,这些容器不是使用比较运算符来组织元素,而是使用一个哈希函数和关键字类型的==运算符
二八、无序容器在存储上组织为一个桶,每个桶保存0个或多个元素,无序容器使用一个哈希函数将元素映射到桶,为了访问一个元素,容器首先计算元素的哈希值,它指出应该搜索哪个桶,容器将具有一个特定哈希值的所有元素都保存在相同的桶中,如果容器允许重复关键字,所有具有相同关键字的元素也都会在同一个桶中。无序容器的性能依赖哈希函数的质量和桶的数量及大小