C++容器(二):关联容器简介
关联容器(associative container)与顺序容器的本质区别在于:关联容器通过键(Key
)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。虽然,关联容器的大部分行为与顺序容器相同,但其独特之处在于支持键的使用。
关联容器支持通过键来高效地查找和读取元素。两个基本的关联容器类型是map
和set
。map
的元素以键-值(key-value)对的形式组织:键用作元素在map
中的索引,而值则表示所存储和读取的元素。set
仅含一个键,并有效地支持关于某个键是否存在的查询。
类型 | 含义 |
---|---|
map |
关联数组:元素通过键来存取和读取 |
set |
大小可变的集合,支持通过键实现的快速读取 |
multimap |
支持同一个键多次出现的map 类型 |
multiset |
支持同一个键多次出现的set 类型 |
一般来说,如果希望有效的存储不同值的集合,那么set
容器比较合适,而map
容器则更适用于需要存储(乃至修改)每个键所关联值的情况。在做某种文本处理时,可使用set
保存要忽略的单词。而字典则是map
的一种很好的应用:单词本身是键,而它的解释说明则是值。
map
和set
类型的对象所包含的元素都具有不同的键,不允许同一个键添加第二个元素。如果一个键必须对应多个实例,则需要使用multimap
和multiset
类型。
关联容器共享大部分—但并非全部—的顺序容器操作。关联容器不提供front
,push_front
,back
,push_back
和pop_back
操作。
总结来说,顺序容器与关联容器公共的操作包括以下几种:
- 三种构造函数:
C<T> c; // creates an empty container
// c2 must be same type as c1
C<T> c1(c2); // copies elements from c2 to c1
// b and e are iterators denoting a sequence
C<T> c(b, e); // copies elements from the sequence into c
关联容器不能通过容器的大小来定义。
关系运算(例如
==
,<
,>
等)。begin
,end
,rbegin
和rend
操作。类型别名(typedef)。 注意,对于
map
容器,value_type
并非元素的类型,而是描述键及其关联值类型的pair
类型。对于这一点将在map
类型的介绍中讲解。swap
和赋值操作。但是关联容器不提供assign
函数。clear
和erase
操作。但是关联容器的erase
运算返回void
类型。关于容器大小的操作。但
resize
函数不能用于关联容器。
参考文献:
- C++ Primer中文版(第四版)》,Stanley B.Lippman et al. 著, 人民邮电出版社,2013。