乐趣区

关于c++:C-STL-map容器

一、前言

在应用 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;}

后果如下:

退出移动版