std::map如何计算重复项

how does std::map work for counting duplicates

本文关键字:计算 map 何计算 std      更新时间:2024-04-29

我是cp的初学者,最近我偶然发现了一个使用向量无法解决的问题,因此我检查了解决方案,发现大多数代码中都有map。有人能解释一下std::map在这个特定问题中是如何工作的吗。这是以下解决方案之一:

int main()
{
int n,mx=0,cnt=0,i,x;
cin>>n;
map<int,int>mp;
for(i=0;i<n;i++)
{
cin>>x;
mp[x]++;
if(mp[x]>mx)
{
mx=mp[x];
}
}
cout<<mx<<endl;
return 0;
}

std::map是一个将一个值关联到一个唯一键的结构。

这样做的净效果是每个不同的键只能有一个值。

因此,在map<int, int> mp的情况下,与mp[123]相关联的值是一个整数。在C++映射中,自动创建不存在的元素,因此在第一次访问时,与mp[123]关联的值将被初始化为0,并且可以使用mp[x]++安全地计数。

话虽如此,使用int键,使用简单的数组也可以实现相同的效果。如果键是密集的,并且已知最大键值,则可以分配数组(向量(并将键用作其中的索引。当键是稀疏的、非数字的或范围未知时,映射很有用。

在您的特定情况下,键的范围似乎是[1..100]。这可以使用数组来解决。不需要地图。

int main()
{
int n, mx = 0, x;
cin >> n;
int mp[101]{};
for (int i = 0; i < n; i++)
{
cin >> x; // 1 <= x <= 100 according to problem definition
mx = max(mx, ++mp[x]);
}
cout << mx << endl;
return 0;
}

mp是迄今为止每个数字在输入中被看到的次数。它是一系列成对的数字,第一个("键"(取自输入,第二个("值"(为计数。在这个程序中,我们不在乎,但这些对是按密钥排序的。

每次循环时,mp[x]++;将数字x的计数加一。如果以前没有看到过这个数字,它会将0增加到1,因为0是默认初始化的int的值。

然后CCD_ 12被设置为其自身和CCD_。