例说数据结构&STL(十一)——hash_map/unordered_map
来源:互联网 发布:奥尼尔在骑士数据 编辑:程序博客网 时间:2024/06/05 06:18
1 白话hash_map/unordered_map
本篇博文,我们来了解另外两个基于key-value的新结构hash_map和unorderd_map。两者都属于基于哈希表(hash table)构建的数据结构,都是存储的key-value的值,可以通过key快速索引到value。它们存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。所以如果需要内部元素自动排序,使用map,不需要排序使用unordered_map,另外当然还要考虑内基底的构建所带来的收益(哈希表和红黑树的比较)。
由于和前面介绍的无序集合容器一样,unordered_map在C++11的时候被引入标准库了,而hash_set并没有,所以建议还是使用unordered_map比较好。
2 unordered_map实战
2.1 头文件
#include<unordered_map> // hash_map则是#iunclude<hash_map>using namespace std;
2.2 unordered_map对象声明
unordered_map和map的构造重载一样有好几种构造函数,但是都是涉及内存分配器,所以我们就按默认定义即可:
unordered_map<int,float> map_fir;unordered_map<int,float> map_sed = {{1,2.00},{2,0.33}}; //初始化
2.3 其他操作
下面我们来看看其包含的公共接口有哪些,由于大部分和map相似,并且很多性质又与unordered_set相似,这块我们一并介绍,不再分开阐述,感兴趣的可以看看下面两篇博文例说数据结构&STL(十)——hash_set/unordered_set和例说数据结构&STL(九)——map。
map_sed.insert(pair<int,float>(100 , 0.1234)); // 插入一个键值对方法一map_sed.insert(map<int,float>::value_type(110, 100.86)); //插入一个键值对方法二map_sed[120] = 10000; // 插入一个键值对方法三int i = map_sed.count(110); // 统计map中某一关键字出现的次数,实际上要么是1要么是0if (map_sed.find(110) != map_sed.end()) // 查询是否存在110关键字,如果没有查询到则会指向end() cout << "exsit!" << endl;unordered_map<int, float>::iterator iter1 = map_sed.lower_bound(2); //返回map中>=2的索引(迭代器),切记不是小于2unordered_map<int, float>::iterator iter2 = map_sed.upper_bound(2); //返回map中>2的索引 unordered_map<int, float>::iterator iter; //对应迭代器对象//正向间接访问for (iter = map_sed.begin(); iter != map_sed.end(); iter++) cout << iter->first << "=" << iter->second << endl;map<int,float>::reverse_iterator iter; //对应反向迭代器对象//反向间接访问for(iter=map_fir.rbegin();iter!=map_fir.rend();iter++) cout << iter->first << "=" << iter->second << endl; //输出关键字与键值unordered_map<int, float>::iterator iter3;iter3 = map_fir.find(1);map_fir.erase(iter3); // 迭代器删除某一个键值对int n = map_fir.erase(1); // 关键字删除,如果删除了会返回1,否则返回0map_fir.erase(map_fir.begin(), map_fir.end()); // 成片删除map_fir.swap(map_sed); // 交换所有数据,需要确保map中元素类型相同map_fir.clear(); // 清空map_firmap_fir.size(); // 统计map_fir中元素个数map_fir.empty(); // 判断map中是否为空,如果是空则返回1
3 小结
上面介绍了unordered_map数据结构特点以及其与map的区别。由于map和set一样是基于红黑树构建的数据结构,而unordered_map和unordered_set是基于哈希表,所以其访问等时间复杂度都为O(1),n为集合中元素的个数。一般情况下如果需要内部元素自动排序,使用map,不需要排序使用unordered_map。
以上是个人学习记录,由于能力和时间有限,如果有错误望读者纠正,谢谢!
转载请注明出处:http://blog.csdn.net/FX677588/article/details/76375350
- 例说数据结构&STL(十一)——hash_map/unordered_map
- STL unordered_map(hash_map)详解
- STL中的map、unordered_map、hash_map
- map 学习(下)——C++ 中的 hash_map, unordered_map
- 例说数据结构&STL(一)——vector
- 例说数据结构&STL(二)——list
- 例说数据结构&STL(三)——deque
- 例说数据结构&STL(四)——queue
- 例说数据结构&STL(五)——stack
- 例说数据结构&STL(六)——heap
- 例说数据结构&STL(七)——priority_queue
- 例说数据结构&STL(八)——set
- 例说数据结构&STL(九)——map
- 例说数据结构&STL(十)——hash_set/unordered_set
- 例说数据结构&STL(十二)——iterator
- 例说数据结构&STL(十三)——pair
- STL容器(四)——hash_map
- hash_map->unordered_map
- linux ssh 免密登录
- 进程管理--之三
- NotePad++作为texlive编辑器的安装及配置
- Python3 网络编程
- 【Spring】IOC底层原理
- 例说数据结构&STL(十一)——hash_map/unordered_map
- POJ2502 subway
- 简单个人网站
- 七、变量
- 深入浅出MyBatis
- Linux 学习笔记(一)
- 多线程断点下载
- session和cookie
- [bzoj 1409] Password 矩阵快速幂+欧拉函数