全网最全STL hashmap使用讲解
看到题目大家会不会觉得我很夸张,事实上真心没有怎么夸张,这几天使用hash_map中遇到了点问题,于是就特别特别想把这个搞精通。但是网上基本都是介绍java中的hashmap的,极少几篇STL hashmap的。奈何小弟使用的是C++,于是乎费了很多周折查阅了大量资料,也没有找到太多资料,在MSDN上搜索hashmap一直出现的是hashmap class,根本不是我想要的东东。后来机智的在msdn查找头文件库找到了hashmap的函数介绍,但是晦涩难懂的介绍而且不自己挨个调试调试很多细节根本无法掌握,于是乎在这个很忙碌很忙碌的晚上刷夜写了这篇博客,绝对是全网介绍最详细的,而且只用了一段代码介绍了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");
}
虽然STL的hashmap 替代为unordered map 类了,但是区别很小而且自己用了hashmap感觉还是非常好用的,建议大家好好看一下,一个夜晚的成果。一大堆事情在背后紧追慢赶~
小殇的第四篇博客,希望大家能够喜欢,希望能帮到有用的人,也希望大家能够积极提出建议我一定会积极研究改正。
此生注定程序员的命,那就在猝死前写好每一次的代码。