I am defining a small function to create a histogram of a vector of integers, Initially I defined the following function that first test whether the key exists in the map before assigning or increment the value.
map<int, int> histogram(vector<int> &a){
map<int, int> hist;
for (auto &x : a){
hist[x] = hist.count(x) == 0 ? 1 : hist[x] + 1; // check key existence
}
return hist;
}
Later, I found the following code also works without checking the existence of the key. Therefore the default value for a non-existent key is supposed to be ZERO. I am wondering is this behavior guaranteed to have a default zero value when referencing a key that does not exist?
map<int, int> histogram(vector<int> &a){
map<int, int> hist;
for (auto &x : a){
hist[x]++; // without key existence checking.
}
return hist;
}
Yes, the value inserted by [] is guaranteed to be zero. From C++11 23.4.4.3/1:
Effects: If there is no key equivalent to
xin the map, insertsvalue_type(x, T())into the map.
T() specifies value-initialisation which, for numeric types, means it's initialised with the value zero.
It is guaranteed to be zero-initialized for built-in types, and default constructed for user-defined types. The guarantee is that if an element for a given key does not exist, one is inserted, with the mapped_type being value initialized. For built-in types such as int, this means zero initialization.
More information in this reference.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With