一、简介
unordered_map是一种无序映射,key值是无序的,内部结构使用的是哈希表,存储的是<key, value>键值对,每次存储的都是一对一对的,而在查询的时候 只能通过key是否存在进行查找,不能同过value的值进行查找
unordered_map内部是用哈希表实现,通过特殊的函数把Key值映射到哈希表中的一个位置来访问记录,查找时间复杂度可达到O(1)。
因此,map适用于有序的问题,unordered_map适用于查找的问题。
二、插入(添加)键值对
- 最常见的是数组形式添加
unordered_map<int, int> myhash;
myhasn[key] = value;
他的作用就是当key不存在的时候,就把键值对存进去,当key存在的时候,会更新value的值
2.用insert插入
// 插入单个键值对
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());
三、取值
//数组方式取值,若不存在该键值,得到空
myMap[100];
//at会下标检查,若不存在该键值会被报错
myMap.at(20);
四、判空
//空返回true 非空返回false
myMap.empty();
五、容量
int length = myMap.size();
六、删除
//erase(const key_type& key) 通过参数Key来进行删除
myMap.erase(1);
//删除迭代器位置的键值对,并返回指向下一元素的迭代器
myMap.erase(myMap.begin());
// 删除一定范围内的元素,并返回一个指向下一元素的迭代器
// 注意:map的迭代器不允许使用+n运算,但可以++
mymap.erase(mymap.begin(), ++mymap.begin());
七、清空
myMap.clear();
八、交换
//交换两个map的内容
map<int,char> secondMap = {5,'t'};
secondMap.swap(myMap);
九、顺序比较
//比较两个关键字在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;
十、查找
//关键字查询,找到返回指向该关键字的迭代器,否则返回指向end的迭代器
map<int,char>::iterator it = myMap.find(1);
if(it != myMap.end())//存在该键值
cout << it->second;
十一、迭代器
//迭代器有八种 begin、end、rbegin、rend和对应的const型 cbegin、cend、crbegin、crend
myMap.begin();//map的第一个键值对
myMap.rbegin();//map的最后一个键值对
十二、遍历
//通过迭代器的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;