C++之unordered_map使用从浅入深

一、简介

unordered_map是一种无序映射,key值是无序的,内部结构使用的是哈希表,存储的是<key, value>键值对,每次存储的都是一对一对的,而在查询的时候 只能通过key是否存在进行查找,不能同过value的值进行查找
unordered_map内部是用哈希表实现,通过特殊的函数把Key值映射到哈希表中的一个位置来访问记录,查找时间复杂度可达到O(1)。

因此,map适用于有序的问题,unordered_map适用于查找的问题。

二、插入(添加)键值对

  1. 最常见的是数组形式添加
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;
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值