例说数据结构&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<intfloat>::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  
 

原创粉丝点击