问题描述
如果我用数组初始化映射 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的第二个元素来返回数组中元素出现的频率?
您在代码片段中正确完成了此操作。您可以使用 at
或 std::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";
}
}
请注意,您的问题提到了 std::map
,但您提供的示例引用了 std::unordered_map
,其中大部分都适用于这两种数据结构。
默认情况下,在尝试访问其键至少一次后,映射的第二个元素初始化为 0(如果它的类型是代码中的 int)。因此,当您第一次访问某个元素 x,mp [x] 变为 0,然后在您的代码中计数时增加 1。