C++ map详解

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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值