map简介
std::map, 定义于头文件 <map>
template
<
class Key,
class T,
class Compare = std::less<Key>,
class Allocator = std::allocator<std::pair<const Key, T> >
> class map;
std::map 是有序键值对容器,它的元素的键是唯一的。。搜索、移除和插入操作拥有对数复杂度。 map 通常底层用红黑树实现.
map中的元素是自动按key升序排序
,若想要屏蔽其自动排序,可用vector<pair<key_tytpe, value_type>>
,而非unordered_map
。
key 与value 的关系,就像数学中的函数横纵坐标映射关系,只能一对一或多对一,不能一对多,即一个 map 中 key是唯一的,value不唯一。
初始化
// 声明时直接初始化
map<int, string> m = {{3, "asc"}, {4, "###"}};
// map.insert({key, value})
m.insert({3, "AZZ"}); // 如果 m 中存在键 1,则返回指向 m 中键 1 的迭代器,否则直接插入。
// map.insert_or_assign({first, second})
m.insert({4, "AZZ"}); // 如果 m 中存在键 4,则更新其键值为 "AZZ",否则直接插入。
// map[key, value]
m[5] = "qwer"; // 与 insert_or_assign({first, second}) 方法效果相同
常用成员函数
成员函数 | details |
---|---|
map.begin() | 返回指向容器第一个元素的迭代器(iterator) |
map.end() | 返回指向容器尾端的迭代器,指向的元素是容器中最后一个元素之后的元素(见上图),是一个理论上的元素 ,实际并不存在。因此指向它的迭代器不能够被解引用(Dereferenced)。引入 map.end() 的目的是为了操作方便,比如通常和map.begin() 配合,确定容器的范围 |
map.empty() | 检查容器是否为空 ,若容器为空则 return true ,否则 return false |
map.size() | 返回容器中的元素数,即std::distance(begin(), end()) |
map.max_size() | 返回根据系统或库实现限制的容器可保有的元素最大数量,即对于最大容器的 std::distance(begin(), end()) 。此值通常反映容器大小上的理论极限,至多为 std::numeric_limits<difference_type>::max() 。运行时,可用 RAM 总量可能会限制容器大小到小于 map.max_size() 的值 |
map.clear() | 从容器擦除所有元素。此后 map.size() 返回零,即map.begin()=map.end() |
map.insert() | ➊map.insert(pair<key_type, value_type>(key, value)) 返回值是一个 pair< const Key, T> 结构,其中第一个元素是一个迭代器,第二个元素是一个 bool 类型,根据以上结果:如果原来的map中不含有插入的元素,则 bool 值为 true ,迭代器指向插入的元素;如果map中已经含有插入的元素了,则 bool 值为false ,返回的迭代器指向对应的 map 中已经存在的元素。➋insert(iter, pair< const Key, T> 返回一个指向插入元素的迭代器,如果 map 中已经存在元素,则返回的迭代器指向原先 map 中已经存在的元素。➌map.insert({pair<key_type, value_type>(key, value), pair<key_type, value_type>(key, value), ··· , pair<key_type, value_type>(key, value)}) 与第一种方法类似,一次插入多组数据;➍map.insert(make_pair(key, value)) 此法要自己保证类型匹配 。➎map[key] = value ,此法最为简单 |
map.erase() | 从容器移除指定的元素。➊map.erase(iterator) ,即通过迭代器删除;➋map.erase(key_value) ;通过键值删除; ➌map.erase(iter_1, iter_2) ,移除范围 [iter_1; iter_2) 中的元素,注意,区间是左闭右开! |
map.swap() | 交换两个容器的内容。map1.swap(map2) ,两个 map 中元素个数可不同,但类型要相同 |
map.count(key) | 返回拥有某 key 的元素个数(0 or 1) |
map.find(key) | 返回键等于 key 的元素的迭代器,如果 map 中不存在该 key,返回 map.end() |
map.at(key) | 返回键等于 key 的元素的键值 value,如果 map 中不存在该 key,运行时会抛出异常std::out_of_range |
map[key] | 返回键等于 key 的元素的键值 value, 如果 map 中不存在该 key, 则将该 key 添加到 map 中,对应键值 value 为空 |
map.contains(key) (C++20) | 若 map 中存在键等于 key ,则返回 true ,否则返回 false |
map的遍历
1. 利用迭代器
for (map<key_type, val_type>::iterator it = Map.begin(); it != Map.end(); it++)
cout << it->first << " -> " << it->second << endl;
2. C++11新特性:auto
for (const auto &p : Map)
cout << p.first << " -> " << p.second << endl;