第10章 关联容器(C++ Primer)

关联容器是标准库容器类型的另一项内容。与顺序容器的本质差别在于:关联容器通过键(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对象中。

原文地址:https://www.cnblogs.com/cinvzi/p/8005537.html