关联容器(五):unordered_map

介绍:
哈希map是一种关联容器,通过键值和映射值存储元素。允许根据键值快速检索各个元素。
在内部unordered_map的元素不以键值或映射的元素作任何特定的顺序排序,其存储位置取决于哈希值,unordered_map容器比map容器更快地通过键值访问他们的单个元素(hash表的思想,以空间换时间),类似下图:

(键,值)对是插入的数据;

索引即对应桶(Bucket);

哈希码对应哈希函数的算法(库中可通过hash_function获取哈希函数);


常用函数:
(1)    构造函数/赋值
operator= 使用另一个unordered_map的拷贝替换unorder

(2)    增加函数/删除函数
clear 清空unordered_map
erase 从unordered_map中移除指定位置或范围的元素
emplace 插入一个元素(不执行copy或move操作)到unorder
emplace_hint 插入一个元素(不执行copy或move操作)到unorder
insert 在unordered_map的指定位置插入一或多个元素

(3)    遍历函数/访问函数
at 返回unordered_map中指定map键对应的map值
begin 返回指向unordered_map中第一个元素的forward
end 返回指向unordered_map的结尾位置之后位置的迭代器
cbegin 返回指向unordered_map中第一个元素的const迭
cend 返回指向unordered_map的结尾位置之后位置的con
equal_range 返回匹配指定key的子序列
operator[] 在unordered_map中查找或插入一个元素

(4)查找/替换/比较
find 返回指向unordered_map中指定key的元素位置的迭
key_eq 返回创建unordered_map使用的comparison

(5)    判断函数
empty 如果unordered_map为空,返回true

(6)    大小函数/个数函数
count 返回unordered_map中指定键对应的元素个数
max_size 返回unordered_map的最大长度
size 返回unordered_map中的元素个数

(7)    其他函数
get_allocator 返回创建unordered_map的Allocator的拷贝
reserve 更改unordered_map对象的容量
swap 交换两个unordered_map中的元素

(8)哈希相关
bucket 返回指定mapkey的bucket索引
bucket_count 得到bucket的个数
bucket_size 返回bucket的大小(size)
hash_function 返回创建unordered_map使用的hashfuncti
load_factor 返回每个bucket中元素的平均个数
max_bucket_count 返回map中bucket的最大个数
max_load_factor 得到或设置每个bucket中元素的最大个数

rehash rehash当前unordered_map(当HashMap的容量达到threshold时就需要进行扩容,这个时候就要进行ReHash操作了,在扩容的过程中需要进行ReHash操作,而这是非常耗时的,在实际中应该尽量避免。)


示例代码:

#include "stdafx.h"
#include 
#include 
#include 
#include 
#include //greater必须包含此文件
#include 
#include 
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	vector> vPair;
	vPair.push_back(make_pair("bbbb", 2222));
	vPair.push_back(make_pair("aaaa", 3333));
	vPair.push_back(make_pair("aaaa", 565565));
	vPair.push_back(make_pair("cccc", 4444));
	vPair.push_back(make_pair("dddd", 5555));
	unordered_map unordered_mapTest;
	unordered_mapTest.insert(vPair.begin(), vPair.end());//插入vector-pair
	unordered_map::iterator iter;
	for (iter = unordered_mapTest.begin(); iter != unordered_mapTest.end(); iter++)
		cout << iter->first << ",bucket:" << unordered_mapTest.bucket(iter->first) << endl;
	cout << " mapTest[\"dddd\"]:" << unordered_mapTest["dddd"] << endl;
	cout << " mapTest.at(\"dddd\"):" << unordered_mapTest.at("dddd") << endl;
	cout << "mapTest.find(\"dddd\"):" << unordered_mapTest.find("dddd")->first << "," << unordered_mapTest.find("dddd")->second << endl;
	cout << unordered_mapTest.bucket("bbbb") << endl;

	unordered_map::hasher hasherFunc= unordered_mapTest.hash_function();
	cout << "hasher code of (\"dddd\"):" << hasherFunc("aaaa") << endl;
	cout << "aaaa哈希表中对应桶为:" << unordered_mapTest.bucket("aaaa") << endl;
	cout << "bbbb哈希表中对应桶为:" << unordered_mapTest.bucket("bbbb") << endl;
	cout << "哈希表中桶的数量:" << unordered_mapTest.bucket_count()<< endl;

	unordered_map::key_equal keyeq = unordered_mapTest.key_eq();
	cout << "key_equal:" << keyeq("aaaa","bbbb") << endl;
	return 0;
}
输出:

dddd,bucket:5
bbbb,bucket:5
cccc,bucket:1
aaaa,bucket:1
 mapTest["dddd"]:5555
 mapTest.at("dddd"):5555
mapTest.find("dddd"):dddd,5555
5
hasher code of ("dddd"):1290481081
aaaa哈希表中对应桶为:1
bbbb哈希表中对应桶为:5
哈希表中桶的数量:8
key_equal:0
请按任意键继续. . .
常用函数参考连接:http://www.howsoftworks.net/cplusplus.api/std/indexunordered_map.html


你可能感兴趣的:(关联容器(五):unordered_map)