1、unordered_map的基本概念
为了提高查询效率,C++11添加了以哈希作为底层结构的关联式容器:unordered_map/unordered_set/unordered_multimap/unordered_multiset,unordered_map是转调hashtable的操作行为,这4个关联式容器的底层结构采用hashtable结构与map/multimap/set/multiset采用红黑树的的底层结构不同,但是功能基本类似。使用的场景不同,如果需要得到一个有序序列,使用红黑树系列的关联式容器,如果需要更高的查询效率,使用以哈希表为底层的关联式容器。其结构如下图所示:
2、unordered_map的操作
使用unordered_map时必须包含<unordered_map>头文件以及std标准命名空间。
(1)insert():插入数据。
(2)erase():删除数据。
(3)find():查找数据。
(4)clear():数据的清空。
(5)empty():数据的判空。
(6)size():获取有效元素的大小。
(7)count():获取键值中查找元素的个数。如果有返回1,否则返回0。
(8)rbegin():在反向迭代器中表示起始元素。
(9)rend():在反向迭代器中表示末尾元素。
(10)operator[key]:通过键值(key)获取该key对应的value。
(11)at(key):通过键值(key)获取key对应的value
(12)lower_bound(val):返回容器中第一个值【大于或等于】val的元素的iterator位置。
(13)upper_bound(val):返回容器中第一个值【大于】。
(14)equal_rand(n):获取值为n的元素的范围。
(15)max_map():返回map中最多包含的元素个数。
(16)bucket_count():返回默认下桶的个数。
(17)max_bucket_count():返回桶的最大个数
(18)bucket_size(m):返回桶号m中元素的个数
(19)bucket(n):返回n所在的桶号
(20)load_factor:返回负载因子
(21)rehash(n):重新哈希,如果n小于桶的个数,则桶的个数可能减少以节省空间;如果n大于桶的个数,则桶的个数会增多大于或等于n的个数。
【例】
#include<iostream>
#include<unordered_map>
#include<stdlib.h>
using namespace std;
void TestUnordered_map1()
{
unordered_map<int, int> m;
//默认下桶的个数
size_t bucket = m.bucket_count();
cout << "m.bucket_count() = " << bucket << endl;
//最大桶的个数
cout << "m.max_bucket_count() = " << m.max_bucket_count() << endl;
//负载因子:有效元素个数/桶的个数 默认情况下为0, 最大为1
//当哈希表中元素存储到一定个数时(负载因子)需要重新哈希
//否则冲突太高会影响哈希的效率
cout << "m.load_factor() = " << m.load_factor() << endl;
cout << "m.max_load_factor() = " << m.max_load_factor() << endl;
for (size_t i = 0; i < bucket; i++)
{
m.insert(pair<int, int>(i, i));
}
cout << "插入元素后:" << endl;
cout << "桶的个数为:" << m.bucket_count() << endl;
cout << "map中元素的个数为:" << m.size() << endl;
cout << "map中的元素有:" << endl;
unordered_map<int, int>::iterator iter = m.begin();
while (iter != m.end())
{
cout << iter->first << "-->" << iter->second << endl;
iter++;
}
//注意:unordered_map中的元素是无序的
//桶以8的倍数进行扩展
cout << "再插入一个元素后:" << endl;
m.emplace(pair<int, int>(9, 9));
cout << "桶的个数为:" << m.bucket_count() << endl;
cout << "map中元素的个数为:" << m.size() << endl;
cout << "map中的元素有:" << endl;
iter = m.begin();
while (iter != m.end())
{
cout << "<" << iter->first << "," << iter->second << ">" << endl;
iter++;
}
//通过key访问key对应的value
cout << "m.at(9) = " << m.at(9) << endl;
//因为键值8不存在,所以m[8]表示新插入一个键值为8,实值为0的元素
cout << "m[8] = " << m[8] << endl;
//统计key在桶中的个数
cout << "m.count(8) = " << m.count(8) << endl;
//返回key所在的桶号
cout << "m.bucket(8) = " << m.bucket(8) << endl;
//统计29号桶中元素的个数
cout << "m.bucket_size(29) = " << m.bucket_size(29) << endl;
//按照设定的值进行重新哈希,作用是节省内存
m.rehash(20);
cout << "m.rehash(20)后桶的个数为:" << m.bucket_count() << endl;
cout << "m.rehash(20)后map中的元素为:" << m.size() << endl;
iter = m.begin();
cout << "m.rehash(20)后元素有:" << endl;
while (iter != m.end())
{
cout << "<" << iter->first << "," << iter->second << ">" << endl;
iter++;
}
m.rehash(100);
cout << "m.rehash(100)后,桶的个数为:" << m.bucket_count() << endl;
cout << "m.rehash(100)后,map中元素的个数为:" << m.size() << endl;
iter = m.begin();
cout << "m.rehash(100)后元素有:" << endl;
while (iter != m.end())
{
cout << "<" << iter->first << "," << iter->second << ">" << endl;
iter++;
}
}
int main()
{
TestUnordered_map1();
system("pause");
return 0;
}
运行结果为: