unordered_multimap在C++ STL中的rehash()函数
unordered_multimap::rehash(N) 是C++ STL中的内置函数,它将容器中的桶数设置为N或更多。如果N大于容器中当前的桶数(bucket_count),则会强制重新散列(rehash)。
新的桶数可以等于或大于N。如果n低于容器中当前的桶数(bucket_count),则该函数可能对桶数没有影响,也可能不强制重新散列。
重新散列是哈希表的重建:容器中的所有元素按照它们的哈希值重排到新的桶集合中。这可能会改变容器中元素的迭代顺序,虽然具有等效键(key)的元素的相对顺序得到保留。 当其负载因子(load factor)在操作中即将超过其max_load_factor时,容器会自动执行重新散列。通过调用rehash来为哈希表保留一定数量的桶(minimum amount of buckets),我们可以避免容器扩展引起多次重新散列的情况.
语法:
unordered_multimap_name.rehash(N)
参数: 该函数接受一个必选参数 N ,它指定容器哈希表的最小桶数。
返回值: 该函数不返回任何值。
下面的程序说明了上面的函数:
程序1:
// C++ program to illustrate the
// unordered_multimap::rehash()
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 声明
unordered_multimap<int, int> sample1, sample2;
// sample1大小被保留,以容纳至少一个元素的桶
sample1.rehash(1);
// 在sample1中插入键和元素
sample1.insert({ 10, 100 });
sample1.insert({ 50, 500 });
// 在sample1中插入键和元素
// sample2大小被保留,以容纳至少三个元素的桶
sample2.rehash(3);
sample2.insert({ 20, 200 });
sample2.insert({ 30, 300 });
sample2.insert({ 30, 150 });
cout << "Sample1的大小为: " << sample1.size();
cout << "\nSample1的键和元素为:";
for (auto it = sample1.begin(); it != sample1.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} ";
}
cout << "\n\nSample2的大小为: " << sample2.size();
cout << "\nSample2的键和元素为:";
for (auto it = sample2.begin(); it != sample2.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} ";
}
return 0;
}
Sample1的大小为:2
Sample1的键和元素为:{50, 500} {10, 100}
Sample2的大小为:3
Sample2的键和元素为:{30, 150} {30, 300} {20, 200}
程序2:
// C++程序举例说明
// unordered_multimap::rehash()
#include <bits/stdc++.h>
using namespace std;
int main()
{
// 声明
unordered_multimap<char, char> sample1, sample2;
// sample1大小被保留到
// 桶至少包含一个元素
sample1.rehash(1);
// 在sample1中插入键和元素
sample1.insert({ 'a', 'A' });
sample1.insert({ 'g', 'G' });
// 在sample2中插入键和元素
// sample2大小被保留到
// 桶至少包含三个元素
sample2.rehash(3);
sample2.insert({ 'b', 'B' });
sample2.insert({ 'c', 'C' });
sample2.insert({ 'd', 'D' });
cout << "Sample1的大小是:" << sample1.size();
cout << "\nSample1的键和元素是:";
for (auto it = sample1.begin(); it != sample1.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} ";
}
cout << "\n\nSample2的大小是:" << sample2.size();
cout << "\nSample2的键和元素是:";
for (auto it = sample2.begin(); it != sample2.end(); it++) {
cout << "{" << it->first << ", " << it->second << "} ";
}
return 0;
}
Sample1的大小是:2
Sample1的键和元素是:{g, G} {a, A}
Sample2的大小是:3
Sample2的键和元素是:{d, D} {c, C} {b, B}