unordered_map

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;
}

运行结果为:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值