Hashmap 源码与原理

本文参考了三篇博文:

1、https://blog.csdn.net/u010335911/article/details/26297859

2、https://blog.csdn.net/srzhz/article/details/7881946/

3、https://blog.csdn.net/ddkxddkx/article/details/6555754

下面给出源码,其他内容参考上述博文吧

hashmap 源码

#include <stdlib.h>  
#include <string>  
#include <iostream>  
#include<hash_map>  
using namespace std;  
struct string_less : public binary_function<const string, const string, bool>  //定义虚函数,以使用hashmap函数  
{  
public:  
    result_type operator()(const first_argument_type& _Left, const second_argument_type& _Right) const  
    {  
        return(_Left.compare(_Right) < 0 ? true : false);  
    }  
};  
int main()  
{  
    hash_map<string, int , hash_compare<string, string_less> > zhao;  
    hash_map<string, int, hash_compare<string, string_less>>::iterator zhi;  
    hash_map<string, int, hash_compare<string, string_less>>::iterator qiang;  
    hash_map<string, int, hash_compare<string, string_less>>::iterator miss;  
    hash_map<string, int, hash_compare<string, string_less>>::iterator you;  
    //运行监视zhao为{ size=9 }  
    zhao["a"] = 1;//键a对应值1  
    zhao["b"] = 2;  
    zhao["c"] = 3;  
    zhao["d"] = 4;  
    zhao["e"] = 5;  
    zhao["f"] = 6;   
    zhao["g"] = 7;  
    zhao["h"] = 8;  
    zhao["i"] = 9;  
  
    zhi=zhao.begin();  
    //监视显示zhi为("a",1)  
    cout<<zhi->first<<" "<< zhi->second<<endl;  
    //输出为:a 1 即first代表键 second代表值  
    qiang = zhi;  
    //可以直接赋值键值对哦  
    cout << (++zhi)->first<<" ";  cout<< (zhi)->second<<endl;  
    //输出f 6。即哈希桶内下一组键值.分开输入是因为cout输出流问题  
    while (qiang != zhao.end())  
        //遍历该哈希桶,可以看到字母的顺序afgbcdehi 即是一定顺序存放的,不要想当然以为按照字母顺序  
    {  
        cout << qiang->first << "\t" << qiang->second << endl; qiang++;  
    }  
    qiang = zhao.end();   
    //监视内容: <读取字符串的字符时出错。>, -842150451)end应该是最后一个键值对后的空间,将其- -就应该是最后一个键值对   
    cout<<zhao.at("d")<<endl;  
    //输出4 此函数用于找到键对应的值  
    cout<<zhao.cbegin()->first<<endl;  
    //输出a,此函数用于返回hash_map第一个元素的迭代器  
    cout << (--zhao.cend())->first <<endl;  
    //输出i。返回一个常量迭代器,此迭代器用于发现hash_map中最后一个元素后的位置。cend与end的区别在于end返回一个迭代器,而cend是一个常量迭代器   。  
    cout << zhao.crbegin()->first << endl;  
    //输出i。返回一个常量迭代器,此迭代器用于发现反向hash_map中的首个元素。  
    cout << (--zhao.crend())->first << endl;  
    //输出a。返回一个常量迭代器,此迭代器用于发现反向hash_map中最后一个元素后的位置。 记得- -哦。  
    //zhao.clear();  
    //亲测可用,清除整个hash。      
    cout<<zhao.count("a")<<endl;   
    //此处输出1     返回 1,若 hash_map 包含排序关键字参数匹配键的元素;返回0,若 hash_map 不包含具有匹配键的元素。  
    cout<<zhao.emplace("j", 10).first->first<<endl;  
    //插入一个元素,通过遍历亲测发现若已经存在该键则无操作,若不存在则进行插入。  
    cout<<zhao.emplace_hint(zhao.begin(), "k", 11)->first<<endl;  
    //输出K 。 插入构造一个元素到 hash_map,附带位置提示.完全不知道第一个变量是干什么的,通过遍历发现并不是插入到该位置,但是返回值可以直接定位到该键  
    cout << zhao.empty()<<endl;  
    //输出0 .  若为空则输出1,非空则输出0.  
    cout<< zhao.equal_range("h").first->first<<endl;  
    //输出h   hash_map中键比指定键大或相等的第一个元素。  
    cout << zhao.equal_range("h").second->first << endl;  
    //输出i  hash_map中键比指定键大的第一个元素,使用j VS崩溃了。  
    zhao.erase("k");  
    //删除掉该键,若不存在则无法删除  
    cout<<zhao.find("a")->second<<endl;  
    //输出1  显而易见。找到该键  
    zhao.insert(++zhao.begin(),--zhao.end());  
    //这个insert,将一个或一个范围的元素插入hash_map。 我尝试了好多好多参数,终于大概理解了,就是把另一个的一段hash插入到这边来。或者这样zhao.insert(zhi,qiang);  
    //zhao.key_comp(); 先不做介绍了,上面那个insert就研究了二十分钟多才懂 同理 zhao.lower_bound()也先放下 upper_bound()也放下  
    cout << zhao.size()<< endl;  
    //10输出元素个数  
    zhao.swap(zhao);  
    //交换两个对象元素的hashmap,或者swap(zhao,zhao);由于我只定义了一个对象..亲多定义一个就可以了。  
    system("pause");  
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值