bucket_count and bucket_size in unordered_map in C++
Last Updated :
03 Jan, 2022
Unordered_map is an associated container that stores elements formed by the combination of key-value and a mapped value. The key value is used to uniquely identify the element and the mapped value is the content associated with the key. Both key and value can be of any type predefined or user-defined.
Bucket: Internally, unordered_map is implemented using a hash table so, a bucket is a slot in the internal hash Table to which elements are assigned based on the hash value of their key. Buckets are numbered from 0 to (bucket_count-1). Hence this function returns the bucket no. where the element with key is located in unordered_map.
Time Complexity: O(1).
Syntax:
unordered_map.bucket(k);
// k is the key corresponds to which
// we want to know bucket number.
Return Value: The order number of the bucket corresponding to key k.
There are two more functions regarding bucket:
1. std::bucket_count: This function is used to count the total no. of buckets in the unordered_map. No parameter is required to pass into this function.
Time Complexity: O(1).
Syntax:
unordered_map.bucket_count();
Return Value: The number of the bucket present in the hash table of unordered_map.
2. std::bucket_size: This function count the number of elements present in each bucket of the unordered_map.
Time Complexity: Linear in the bucket size.
Syntax:
unordered_map.bucket_size(i);
// 'i' is the bucket number in which we want
// to find no. of elements. (i < bucket_count)
Return Value: The number of elements present in bucket ‘i’.
CPP
#include <bits/stdc++.h>
using namespace std;
int main()
{
unordered_map<string, double > umap;
umap[ "PI" ] = 3.14;
umap[ "root2" ] = 1.414;
umap[ "log10" ] = 2.302;
umap[ "loge" ] = 1.0;
umap[ "e" ] = 2.718;
for ( auto & x : umap) {
cout << "(" << x.first << ", " << x.second << ")" ;
cout << " is in bucket= " << umap.bucket(x.first)
<< endl;
}
cout << endl;
int n = umap.bucket_count();
cout << "umap has " << n << " buckets.\n\n" ;
for ( int i = 0; i < n; i++) {
cout << "Bucket " << i << " has "
<< umap.bucket_size(i) << " elements.\n" ;
}
return 0;
}
|
Output
(loge, 1) is in bucket= 5
(e, 2.718) is in bucket= 4
(log10, 2.302) is in bucket= 4
(PI, 3.14) is in bucket= 0
(root2, 1.414) is in bucket= 3
umap has 7 buckets.
Bucket 0 has 1 elements.
Bucket 1 has 0 elements.
Bucket 2 has 0 elements.
Bucket 3 has 1 elements.
Bucket 4 has 2 elements.
Bucket 5 has 1 elements.
Bucket 6 has 0 elements.
We can also print all the elements present in each bucket of the unordered_map.
CPP
#include <bits/stdc++.h>
using namespace std;
int main()
{
unordered_map<string, double > umap;
umap[ "PI" ] = 3.14;
umap[ "root2" ] = 1.414;
umap[ "log10" ] = 2.302;
umap[ "loge" ] = 1.0;
umap[ "e" ] = 2.718;
unsigned n = umap.bucket_count();
for (unsigned i = 0; i < n; i++) {
cout << "Bucket " << i << " contains: " ;
for ( auto it = umap.begin(i); it != umap.end(i);
it++)
cout << "(" << it->first << ", " << it->second
<< ") " ;
cout << "\n" ;
}
return 0;
}
|
Output
Bucket 0 contains: (PI, 3.14)
Bucket 1 contains:
Bucket 2 contains:
Bucket 3 contains: (root2, 1.414)
Bucket 4 contains: (e, 2.718) (log10, 2.302)
Bucket 5 contains: (loge, 1)
Bucket 6 contains:
Use of bucket in std::unordered_map: There is a number of algorithms that require the objects to be hashed into some number of buckets, and then each bucket is processed. Let say, you want to find duplicates in a collection. You hash all items in the collection, then in each bucket, you compare items pairwise. A bit less trivial example is the Apriori algorithm for finding frequent itemsets.
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...