地图 STL 的第二个元素的默认值?

问题描述

如果我用数组初始化映射 STL 中第二个元素的认值是多少? 例如:

 #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,10,5,20 }; 
    int n = sizeof(arr) / sizeof(arr[0]); 
    countFreq(arr,n); 
    return 0; 
} 

这个程序如何通过访问map mp的第二个元素来返回数组中元素出现的频率?

解决方法

如果我用数组初始化 map STL 中第二个元素的默认值是多少?

当使用 std::map 访问 operator[] 中的键值对 (kvp) 时,要么键已经存在,要么构造了一个新的 kvp 并且 mapped_type 为 {{3 }}。值初始化的 int 始终为 0。这要求它必须是默认可构造的。请注意,您还可以使用 value-initialised 成员函数访问映射中的条目,如果未找到键,则该函数将抛出。

这个程序如何通过访问map mp的第二个元素来返回数组中元素出现的频率?

您在代码片段中正确完成了此操作。您可以使用 atstd::multiset,它们提供 std::unordered_multiset 成员函数,即键的频率。

#include <set>
#include <iostream>

int main() 
{
    int arr[] = { 10,20,10,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";
    }
}

count


请注意,您的问题提到了 std::map,但您提供的示例引用了 std::unordered_map,其中大部分都适用于这两种数据结构。

,

默认情况下,在尝试访问其键至少一次后,映射的第二个元素初始化为 0(如果它的类型是代码中的 int)。因此,当您第一次访问某个元素 x,mp [x] 变为 0,然后在您的代码中计数时增加 1。