一、头文件
#include "map"
#include "unordered_map"
二、原理
map内部是用红黑树(不严格平衡的二叉排序树)实现的,能够根据插入键值的不同进行自动排序,中序遍历该树即可得到从小到大递增的键值。
unordered_map内部是用哈希表实现,通过特殊的函数把Key值映射到哈希表中的一个位置来访问记录,查找时间复杂度可达到O(1)。
因此,map适用于有序的问题,unordered_map适用于查找的问题。
三、用法
map与unordered_map相同,只需将下面的map换成unordered_map即可。
1、初始化
map<int, char> myMap;
map<int, char> myMap = {
{ 1, 'a' },
{ 2, 'b' },
{ 3, 'c' } };
2、插入
//直接通过数组方式插入
myMap[10]='y';
// 插入单个键值对
myMap.insert(pair<int, char>(6, 'h'));
//在指定位置插入,效率更高,不需要排列
myMap.insert(myMap.begin()+3, pair<int, char>(101, 't'));
// 多个键值插入
myMap.insert({ {100, 'i'}, {200, 'q'} });
//范围多键值插入
map<int,char> secondMap;
secondMap.insert(myMap.begin(), myMap.end());
3、取值
//数组方式取值,若不存在该键值,得到空
myMap[100];
//at会下标检查,若不存在该键值会被报错
myMap.at(20);
4、判空
//空返回true 非空返回false
myMap.empty();
5、容量
int length = myMap.size();
6、删除
//erase(const key_type& key) 通过参数Key来进行删除
myMap.erase(1);
//删除迭代器位置的键值对,并返回指向下一元素的迭代器
myMap.erase(myMap.begin());
// 删除一定范围内的元素,并返回一个指向下一元素的迭代器
// 注意:map的迭代器不允许使用+n运算,但可以++
mymap.erase(mymap.begin(), ++mymap.begin());
7、清空
myMap.clear();
8、交换
//交换两个map的内容
map<int,char> secondMap = {5,'t'};
secondMap.swap(myMap);
9、顺序比较
//比较两个关键字在map中位置的先后,第一个key在前就返回1,否则0
mymap.insert(std::pair<int, char>(2, 'a'));
mymap.insert(std::pair<int, char>(1, 'b'));
//该用例返回1,因为map是有序的红黑树,即使是先插入2,再插入1
std::map<int, char>::key_compare mycomp = mymap.key_comp();
int res = mycomp(1, 2);
cout << res;
10、查找
//关键字查询,找到返回指向该关键字的迭代器,否则返回指向end的迭代器
map<int,char>::iterator it = myMap.find(1);
if(it != myMap.end())//存在该键值
cout << it->second;
11、迭代器
//迭代器有八种 begin、end、rbegin、rend和对应的const型 cbegin、cend、crbegin、crend
myMap.begin();//map的第一个键值对
myMap.rbegin();//map的最后一个键值对
12、遍历
//通过迭代器的first得到key值,second得到value值
//正序遍历
for(map<char,int>::iterator it = myMap.begin();it!=myMap.end();it++)
cout << "key:" << it->first << " value:" << it->second << endl;
//逆序遍历
for (map<int, char>::reverse_iterator it = mymap.rbegin(); it != mymap.rend(); it++)
cout << "key:" << it->first << " value:" << it->second << endl;
参考:https://blog.csdn.net/shuzfan/article/details/53115922#%E4%B8%80-%E5%A3%B0%E6%98%8E