map 容器是关联式容器的一种,存储的都是pair 类模板创建的键值对;键值对,其中第一个元素作为键(key),第二个元素作为值(value)。
在使用 map 容器存储多个键值对时,该容器会自动根据各键值对的键的大小,按照既定的规则进行排序。
默认情况下,map 容器选用std::less排序规则(其中 T 表示键的数据类型)是做升序排序
使用 map 容器存储的各个键值对,键的值既不能重复也不能被修改。
map的迭代器:C++ STL 标准库为 map 容器配备的是双向迭代器(bidirectional iterator)。这意味着,map 容器迭代器只能进行 ++p、p++、–p、p–、*p 操作,并且迭代器之间只能使用 == 或者 != 运算符进行比较。
较常用的迭代器有:begin(), end(), find(key), lower_bound(key), upper_bound(key)等。
注意:find() 能帮我们查找指定 key 值的键值对,如果成功找到,则返回一个指向该键值对的双向迭代器;反之,其功能和 end() 方法相同。
关于map的查找方法:
1、重载运算符【】:
如果查找的键值对存在,借助重载的 [ ] 运算符才能成功获取该键对应的值;
如果不存在,则为向该 map 容器中增添一个键值对,值的数据类型,如果是基本数据类型(int/double/longlong),则值为 0;如果是 string 类型,其值为 “”,即空字符串(即使用该类型的默认值作为键值对的值)
2、at()函数
at() 成员方法也需要根据指定的键,才能从容器中找到该键对应的值
不同之处在于,如果在当前容器中查找失败,该方法不会向容器中添加新的键值对,而是直接抛出 out_of_range 异常。
3、如果以上方法都不适用,我们还可以遍历整个 map 容器,找到包含指定键的键值对,进而获取该键对应的值,例如:
for (auto iter = myMap.begin(); iter != myMap.end(); ++iter) {
//调用 string 类的 compare() 方法,找到一个键和指定字符串相同的键值对
if (!iter->first.compare("C语言教程")) {
cout << iter->first << " " << iter->second << endl;
}
}
return 0;
关于map的插入数据方法:
1、重载运算符【】:如果键值在已有的map里不存在,则为向该 map 容器中增添一个键值对,值的数据类型,如果是基本数据类型(int/double/longlong),则值为 0;如果是 string 类型,其值为 “”,即空字符串(即使用该类型的默认值作为键值对的值)
2、用insect()函数:返回的是一个pair,其中 pair.first 表示一个迭代器,pair.second 为一个 bool 类型变量(不过插入的时候可以不管返回值)