Prashant
Prashant

Reputation: 33

Default value for the second element of the map STL?

what is the default value for second element in map STL if i am initializing it with an array? for example:

 #include <bits/stdc++.h> 
using namespace std; 
  
void countFreq(int arr[], int n) 
{ 
    unordered_map<int, int> mp; 
  
    // Traverse through array elements and 
    // count frequencies 
    for (int i = 0; i < n; i++) 
        mp[arr[i]]++; 
  
    // Traverse through map and print frequencies 
    for (auto x : mp) 
        cout << x.first << " " << x.second << endl; 
} 
  
int main() 
{ 
    int arr[] = { 10, 20, 20, 10, 10, 20, 5, 20 }; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    countFreq(arr, n); 
    return 0; 
} 

How can this program return the frequency of the element in the array by accessing the second element of map mp?

Upvotes: 0

Views: 270

Answers (2)

Mansoor
Mansoor

Reputation: 2438

what is the default value for the second element in map STL if I am initializing it with an array?

When accessing a key-value pair (kvp) in a std::map with operator[], either the key already exists, or a new kvp is constructed and the mapped_type is value-initialised. A value-initialized int is always 0. This imposes a requirement that it must be default constructible. Note that you can also access entries in a map using the at member function, which throws if the key is not found.

How can this program return the frequency of the element in the array by accessing the second element of map mp?

You have done this correctly in your code snippet. You could have used a std::multiset or std::unordered_multiset, they provide a count member function, that is the frequency of the key.

#include <set>
#include <iostream>

int main() 
{
    int arr[] = { 10, 20, 20, 10, 10, 20, 5, 20 }; 
    std::multiset<int> freq (std::begin(arr), std::end(arr));

    for(auto elem = freq.begin();
        elem != freq.end();
        elem=freq.upper_bound(*elem)) // Traverse the unique elements
    {
        std::cout << *elem << " count: " << freq.count(*elem) << "\n";
    }
}

Godbolt


Note that your question mentions std::map but the example you provided references std::unordered_map, much of this applies to both data-structures.

Upvotes: 1

Marko
Marko

Reputation: 138

Second element of map is, by default, initialized to 0(if its type is int as is in code) after trying to access its key at least once.So, when you access for the first time some element x, mp[x] becomes 0 and then in your code increases by 1 when counting.

Upvotes: 0

Related Questions