C++中申请哈希表的函数:unordered_map讲解

        在C++中,存在一种简单申请哈希表的函数:unordered_map<element type> name {{},{}}

一.对该函数的简要介绍:

1、unordered_map是存储<key, value>键值对的关联式容器,其允许通过key快速的索引到与其对应的value(hashmap<key> == value)
2、unordered_map中,键值通常用于唯一的标识元素,而映射值是一个对象,其内容与此键关联,键和映射的类型可以不同
3、在内部,unordered_map没有对<key, value>进行排序,unordered_map将相同哈希值的键值对放在对应的桶中
4、unordered_map容器通过key访问单个元素比map快,但它遍历元素子集的范围和迭代方面效率较低
5、unordered_map实现了直接访问操作符(operator[])允许通过key作为参数访问value
6、unordered_map的迭代器至少是前向迭代器


二. unordered_map迭代器

成员方法功能
begin()返回指向容器中第一个键值对的正向迭代器。
end() 返回指向容器中最后一个键值对之后位置的正向迭代器。
cbegin()和 begin() 功能相同,只不过在其基础上增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。
cend()和 end() 功能相同,只不过在其基础上,增加了 const 属性,即该方法返回的迭代器不能用于修改容器内存储的键值对。
find(key)查找以 key 为键的键值对,如果找到,则返回一个指向该键值对的正向迭代器;反之,则返回一个指向容器中最后一个键值对之后位置的迭代器(如果 end() 方法返回的迭代器)。
equal_range(key)返回一个 pair 对象,其包含 2 个迭代器,用于表明当前容器中键为 key 的键值对所在的范围。

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
    //创建 umap 容器
    unordered_map<string, string> umap{
        {"Python教程","http://python/"},
        {"Java教程","http://java/"},
        {"Linux教程","http://linux/"} };
    cout << "umap 存储的键值对包括:" << endl;
    //遍历输出 umap 容器中所有的键值对
    for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
        cout << "<" << iter->first << ", " << iter->second << ">" << endl;
    }
    //获取指向指定键值对的前向迭代器
    unordered_map<string, string>::iterator iter = umap.find("Java教程");
    cout <<"umap.find(\"Java教程\") = " << "<" << iter->first << ", " << iter->second << ">" << endl;
    return 0;
}

下面为程序输出结果:

umap 存储的键值对包括:
<Python教程, http://python/>
<Linux教程, http://linux/>
<Java教程, http://java/>
umap.find("Java教程") = <Java教程, http://java/>

三.unordered_map使用方法:

#include <iostream>
using namespace std;
#include <unordered_map>

int main()
{
	unordered_map<string, double> myrecipe,mypantry = { { "milk", 2.0 }, { "flour", 1.5 } };

	pair<string, double> myshopping("baking powder", 0.3);
    //插入操作
	myrecipe.insert(myshopping);                        // 在表中再插入表
	myrecipe.insert(pair<string, double>("eggs", 6.0)); // 
	myrecipe.insert(mypantry.begin(), mypantry.end());  // 遍历
	myrecipe.insert({ { "sugar", 0.8 }, { "salt", 0.1 } });    // 初始化表

	unordered_map<std::string, std::string> mymap;

	// populating container:
	mymap["U.S."] = "Washington";
	mymap["U.K."] = "London";
	mymap["France"] = "Paris";
	mymap["Russia"] = "Moscow";
	mymap["China"] = "Beijing";
	mymap["Germany"] = "Berlin";
	mymap["Japan"] = "Tokyo";

	// erase examples:
	mymap.erase(mymap.begin());      // 用迭代器擦除
	mymap.erase("France");             // 通过检索键值来擦除
	mymap.erase(mymap.find("China"), mymap.end()); // 通过序列来擦除

	//capacity examples:
	cout << mymap.size() << endl;
	cout << mymap.empty() << endl;

	mymap.clear();
	cout << mymap.size() << endl;
	cout << mymap.empty() << endl;

	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值