一、前言
在应用 map 容器存储多个键值对时,该容器会主动依据各键值对的键的大小,依照既定的规定进行排序。默认状况下,会依据键的大小对所有键值对做升序排序。
留神点: 应用 map 容器存储的各个键值对,键的值既不能反复也不能被批改,即键的类型会用 const 润饰,且是一对一的关系。
应用 map 容器应蕴含头文件:
#include <map>
using namespace std; // 不是必须的
1、map 容器的模板定义
template < class Key, // 指定键(key)的类型
class T, // 指定值(value)的类型
class Compare = less<Key>, // 指定排序规定
class Alloc = allocator<pair<const Key,T> > // 指定分配器对象的类型
> class map;
尽管 map 的模板有 4 个参数,然而大多数状况下只须要设置前 2 个参数即可。
二、创立 map 容器办法
①std::map<std::string, std::string> myMap;
②std::map<std::string, std::string> myMap{{"1","lin"},{"2","wei"} };
③std::map<std::string, std::string> newMap(myMap);
④std::map<std::string, std::string> newMap(myMap.begin(), myMap.end());
⑤std::map<std::string, std::string, std::less<std::string> > myMap{{"1","lin"},{"2","wei"} };
三、map 容器办法
此处不列举迭代器、插入和删除相干办法
办法 | 性能 |
---|---|
find(key) | 在 map 容器中查找键为 key 的键值对,如果胜利找到,则返回指向该键值对的双向迭代器;反之,则返回和 end() 办法一样的迭代器。另外,如果 map 容器用 const 限定,则该办法返回的是 const 类型的双向迭代器 |
lower_bound(key) | 返回一个指向以后 map 容器中第一个大于或等于 key 的键值对的双向迭代器。如果 map 容器用 const 限定,则该办法返回的是 const 类型的双向迭代器 |
upper_bound(key) | 返回一个指向以后 map 容器中第一个大于 key 的键值对的迭代器。如果 map 容器用 const 限定,则该办法返回的是 const 类型的双向迭代器 |
equal_range(key) | 该办法返回一个 pair 对象(蕴含 2 个双向迭代器),其中 pair.first 和 lower_bound() 办法的返回值等价,pair.second 和 upper_bound() 办法的返回值等价。也就是说,该办法将返回一个范畴,该范畴中蕴含的键为 key 的键值对(map 容器键值对惟一,因而该范畴最多蕴含一个键值对) |
empty() | 若容器为空,则返回 true;否则 false |
size() | 返回以后 map 容器中存有键值对的个数 |
max_size() | 返回 map 容器所能包容键值对的最大个数,不同的操作系统,其返回值亦不雷同 |
operator[] | map 容器重载了 [] 运算符,只有晓得 map 容器中某个键值对的键的值,就能够向获取数组中元素那样,通过键间接获取对应的值 |
at(key) | 找到 map 容器中 key 键对应的值,如果找不到,该函数会引发 out_of_range 异样 |
count(key) | 在以后 map 容器中,查找键为 key 的键值对的个数并返回。留神,因为 map 容器中各键值对的键的值是惟一的,因而该函数的返回值最大为 1 |
四、实例
1、lower_bound、upper_bound 和 equal_range
std::map<int, string> mapInfo{{1,"test"},{2,"lin"},{3,"wei"} };
std::map<int, string>::iterator mapIter = mapInfo.lower_bound(1);
std::cout << "lower_bound key:" << mapIter->first << "value:" << mapIter->second << std::endl;
mapIter = mapInfo.upper_bound(1);
std::cout << "upper_bound key:" << mapIter->first << "value:" << mapIter->second << std::endl;
pair<map<int, string>::iterator, map<int, string>::iterator> iters = mapInfo.equal_range(3);
std::map<int, string>::iterator beginIter, endIter;
beginIter = iters.first;
endIter = iters.second;
for (beginIter; beginIter != endIter; beginIter++)
{std::cout << "equal_range key:" << beginIter->first << "value:" << beginIter->second << std::endl;}
后果如下: