本篇学习unordered_set的桶接口和哈希策略操作begin(size_type) cbegin(size_type)返回一个迭代器,指向指定的桶的开始
end(size_type) cend(size_type)返回一个迭代器,指向指定的桶的末尾
bucket_count返回桶数
max_bucket_count返回桶的最大数量
bucket_size返回在特定的桶中的元素数量
bucket返回带有特定键的桶
哈希策略
load_factor返回每个桶的平均元素数量
max_load_factor管理每个桶的平均元素数量的最大值
rehash为至少为指定数量的桶预留存储空间并重新生成散列表
reserve为至少为指定数量的元素预留存储空间并重新生成哈希表。
#include <iostream>
#include <unordered_set>
#include <string>
using namespace std;
void bucketOperator()
{
unordered_set<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_set<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_set<int>::iterator beginIt = set1.begin(index);
cout << *beginIt << endl;
unordered_set<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_set<int>::iterator endIt = set1.end(index);
--endIt;
cout << *endIt << endl;
unordered_set<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;
}
运行结果:
参考: