首页 > 技术文章 > C++容器(二):关联容器简介

hehehaha 2015-10-01 21:06 原文

关联容器(associative container)与顺序容器的本质区别在于:关联容器通过键(Key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。虽然,关联容器的大部分行为与顺序容器相同,但其独特之处在于支持键的使用。

关联容器支持通过键来高效地查找和读取元素。两个基本的关联容器类型是mapsetmap的元素以键-值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的元素。set仅含一个键,并有效地支持关于某个键是否存在的查询。

类型 含义
map 关联数组:元素通过键来存取和读取
set 大小可变的集合,支持通过键实现的快速读取
multimap 支持同一个键多次出现的map类型
multiset 支持同一个键多次出现的set类型

一般来说,如果希望有效的存储不同值的集合,那么set容器比较合适,而map容器则更适用于需要存储(乃至修改)每个键所关联值的情况。在做某种文本处理时,可使用set保存要忽略的单词。而字典则是map的一种很好的应用:单词本身是键,而它的解释说明则是值。

mapset类型的对象所包含的元素都具有不同的键,不允许同一个键添加第二个元素。如果一个键必须对应多个实例,则需要使用multimapmultiset类型。

关联容器共享大部分—但并非全部—的顺序容器操作。关联容器不提供front,push_front,back,push_backpop_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, rbeginrend操作。

  • 类型别名(typedef)。 注意,对于map容器,value_type并非元素的类型,而是描述键及其关联值类型的pair类型。对于这一点将在map类型的介绍中讲解。

  • swap和赋值操作。但是关联容器不提供assign函数。

  • clearerase操作。但是关联容器的erase运算返回void类型。

  • 关于容器大小的操作。但resize函数不能用于关联容器。

参考文献:

  • C++ Primer中文版(第四版)》,Stanley B.Lippman et al. 著, 人民邮电出版社,2013。

推荐阅读