关联容器是标准库容器类型的另一项内容。与顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素。
关联容器(associative container)支持通过键来高效地查找和读取元素。两个基本的关联容器类型是map和set。map的元素以键-值(key-value)对的形式组织:键用作元素在map中的索引,而值则表示所存储和读取的数据。set仅包含一个键,并有效地支持关于某个键是否存在的查询。
map 关联数组,元素通过键来存储和读取 set 大小可变的集合,支持通过键实现的快速读取 multimap 支持同一个键多次出现的map类型 multiset 支持同一个键多次出现的set类型
10.2 关联容器
关联容器共享大部分——但并非全部——的顺序容器操作。关联容器不提供front、push_front 、pop_front、back、push_back以及pop_back。
10.3 map类型
map是键-值对的集合。map类型通常可理解为关联数组:可使用键作为下标来获取一个值,正如内置数据类型一样。而关联的本质在于元素的值与某个特定的键相关联,而并非通过元素在数组中的位置来获取。
10.3.1 map对象的定义
要使用map对象,则必须包含map头文件。在定义map对象时,必须分别指明键和值得类型。
map<string, int> word_count;
map<k, v> m; 创建一个名为m的空的map对象,其键和值得类型分别为k和v map<k, v> m(m2); 创建一个m2的副本m,m与m2必须有相同的键类型和值类型 map<k, v> m(b ,e); 创建map类型的对象m,存储迭代器b和e标记的范围内的左右元素的副本。元素的类型必须能转换为pair<const k, v>
对于键类型,唯一的约束就是必须支持 < 操作符,至于是否支持其他的关系或相等运算,则不作要求。
10.3.2 map定义的类型
map对象的元素是键-值对,也即每个元素包含两个部分:键以及由键关联的值。
map<K, V>::key_type 在map容器中,用作索引的键的类型 map<K, V>::mapped_type 在map容器中,键所关联的值的类型 map<K, V>::value_type 一个pair类型,它的first元素具有const map<K, V>::key_type类型,它的second元素为map<K, V>::mapped_type类型
value_type是存储元素的键以及值的pair类型,而且键为const。它的值成员可以修改,但键成员不能修改。
1.map迭代器进行解引用将产生pair类型的对象
对迭代器进行解引用时,将获得一个引用,指向容器中一个value_type类型的值。对于map,其value_type是pair类型。
1 map<string, int>::iterator map_it = word_count.begin(); 2 cout << map_it->first; 3 cout << " " << map_it->second; 4 map_it->first = "new key"; //error: key is const 5 ++map_it->second; //we can change value through an iterator
10.3.3 给map添加元素
给map添加元素,可以用insert成员实现;或者先用下标操作符获取元素,然后给获取的元素赋值。
10.3.4 使用下标访问map对象
1 map <string, int> word_count; 2 word_count["Anna"] = 1;
在执行上述代码时,将发生以下事情:
1)在word_count中查找键为Anna的元素,没有找到
2)将一个新的键-值对插入到word_count中,它的键为const string类型的对象,保存Anna。而它的值采用值初始化,为0
3)将这个新的键-值对插入到word_count中
4)读取新插入的元素,并将它的值赋为1
如同其他下标操作一样,map的下标也使用索引来获取该键所关联的值。如果该键已在容器中,则map的下标运算与vector的下标运算相同:返回该键所关联的值。只有在所查找的键不存在时,map容器才为该键创建一个新的元素,并将它插入到此map对象中。