unordered_multiset学习之桶接口和哈希策略操作

本篇学习unordered_multiset的桶接口和哈希策略操作,具体函数如下:

begin(size_type) cbegin(size_type)

(C++11)

返回一个迭代器,指向指定的桶的开始
(公开成员函数)

end(size_type) cend(size_type)

(C++11)

返回一个迭代器,指向指定的桶的末尾
(公开成员函数)

bucket_count

(C++11)

返回桶数
(公开成员函数)

max_bucket_count

(C++11)

返回桶的最大数量
(公开成员函数)

bucket_size

(C++11)

返回在特定的桶中的元素数量
(公开成员函数)

bucket

(C++11)

返回带有特定键的桶
(公开成员函数)

load_factor

(C++11)

返回每个桶的平均元素数量
(公开成员函数)

max_load_factor

(C++11)

管理每个桶的平均元素数量的最大值
(公开成员函数)

rehash

(C++11)

为至少为指定数量的桶预留存储空间并重新生成散列表
(公开成员函数)

reserve

(C++11)

为至少为指定数量的元素预留存储空间并重新生成哈希表。
(公开成员函数)

代码示例:

#include <iostream>
#include <unordered_set>
#include <string>

using namespace std;

void bucketOperator()
{
    unordered_multiset<int> set1 = {20,21,23,22,24,30,31,33,32,34,10,11,13,12,14,
       29,27,28,26,25,39,37,38,36,35,19,17,18,16,15};
    cout << "set1.size = " << set1.size() << " set1.empty = " << set1.empty() << " set1.max_size = " << set1.max_size() << endl;
    cout << "set1 of value:" << endl;
    int n = 0;
    for(auto &val: set1)
    {
        cout << val << "\t";
        ++n;
        if(n % 10 == 0)
            cout << endl;
    }

    //1.返回桶数bucket_count
    int bCount = set1.bucket_count();
    cout << "bucket_count = " << bCount << endl;
    //由运行结果看到一个元素一个桶,并用桶的个数比元素还多

    //2.返回桶的最大数量max_bucket_count
    int bMax = set1.max_bucket_count();
    cout << "max_bucket_count = " << bMax << endl;

    //3.返回在特定的桶中的元素数量bucket_size
    std::unordered_multiset<int> set2 = {5,15,25,35};

    for (auto& x: set2) {
        std::cout << x << "\t";
        std::cout << " is in bucket #" << set2.bucket(x) << std::endl;
    }
    int bc = set2.bucket_count();
    cout << "set2.count == " << bc << endl;
    for(int i = 0; i < bc; ++i)
    {
        int bs = set2.bucket_size(i);
        cout << i << " # bucket element count = " << bs << endl;
    }
    cout << endl;
    //4.返回带有特定键的桶 的编号bucket
    int nIndex = set1.bucket(90);//为什么不是关键字也能返回nIndex
    cout << "bucket index = " << nIndex << endl;

    //5.桶的开始迭代器begin(index), cbegin(index);
    int index = 2;
    int nCount = set1.bucket_size(index);//第index个桶元素的数量
    if(nCount > 0)
    {
        unordered_multiset<int>::iterator beginIt = set1.begin(index);
        cout << *beginIt << endl;
        unordered_multiset<int>::const_iterator cbeginIt = set1.cbegin(index);
        cout << *cbeginIt << endl;
    }
    else
    {
        cout << "this bucket is empty, not element" << endl;
    }

    //6.桶的尾迭代器end(index), cend(index);
    if(nCount > 0)
    {
        unordered_multiset<int>::iterator endIt = set1.end(index);
        --endIt;
        cout << *endIt << endl;
        unordered_multiset<int>::const_iterator cendIt = set1.cend(index);
        --cendIt;
        cout << *cendIt << endl;
    }


    //7.load_factor(C++11)返回每个桶的平均元素数量
    int loadFactor = set1.load_factor();
    cout << "loadFactor = " << loadFactor << endl;
    //8.max_load_factor(C++11)管理每个桶的平均元素数量的最大值
    int maxLoadFactor = set1.max_load_factor();//最大因子为1,表示每个桶最多一个无素
    cout << "maxLoadFactor = " << maxLoadFactor << endl;

    //9.rehash(C++11)为至少为指定数量的桶预留存储空间并重新生成散列表
    int b1 = set1.bucket_count();
    cout << "old bucket count ======== " << b1 << endl;
    set1.rehash(32);//设置为32个桶  设置的这个值不能比元素个数少,如果设置的比元素个数少,则会设置成元素的个数
    //例如,现在有32个元素,如果设置为16,设置后,桶的个数会是32
    int b2 = set1.bucket_count();
    cout << "after set bucket count == " << b2 << endl;
    //10.reserve(C++11)为至少为指定数量的元素预留存储空间并重新生成哈希表。
    int rs1 = set1.bucket_count();
    cout << "old bucket count ======== " << rs1 << endl;
    set1.reserve(34);//设置为32个桶  分配的空间大于等于元素的个数,
    //例如,设置为32,则桶个数为32,设置为34,桶的个数为64,空间成倍分配
    int rs2 = set1.bucket_count();
    cout << "after set bucket count == " << rs2 << endl;
}

int main()
{
    bucketOperator();

    cout << "Hello, world!" << endl;
    return 0;
}

运行结果:

 

参考:

https://zh.cppreference.com/w/cpp/container/unordered_multiset

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值