stl-hash_map

来源:互联网 发布:淘宝卖家怎么激活 编辑:程序博客网 时间:2024/06/08 11:32

简介

①hash_map的特性是所有的元素并不会自动排序,因为其底层是用hash_table。hash_table并没有自动排序的功能,这一点与map有区别,hash_map的所有元素都是pair,即key-value。
pair定义:

template<class T1,class T2>struct pair{    typedef T1 first_type;    typedef T2 second_type;    T1 first;    T2 second;    pair():first(T1()),second(T2()){}    pair(const T1& a,const T2& b):first(a),second(b){}}

②SGI STL hash_map底层机制是hash_table,每个节点的内容是pair。hash_table把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的 情况下,用空间换时间的做法是值得的。其基本原理是:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下 标,hash值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对 应的地方,称为桶。
但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。 总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。

示例

#include <hash_map>...struct eqstr{    bool operator()(const char* s1,const char* s2)const    {        return strcmp(s1,s2) == 0;    }};hash_map<const char*,int,hash<const char*>,eqstr> temp;插入元素temp["zhangsan"] = 1;temp["lisi"] = 2;迭代器使用hash_map<const char*,int,hash<const char*>,eqstr>::iterator temp_iter = temp.begin();for(;temp_iter!=temp.end();temp_iter++)    cout<<temp_iter->first<<' '<<temp_iter->second<<endl;获取值int num = temp["zhangsan"];
原创粉丝点击