我遇到了一个使用STL Map的竞争问题的解决方案,我已经知道了不同类型的插入。我知道这些插入(及其差异):
Map[key] = value;
和Map.insert(make_pair(key,val));
但是这个我不知道它在做什么,只是它适用于我需要解决的问题:
std::map<int, int> freq;
int inp;
// ...
for (int i = 0; i < n; i++)
{
scanf ("%d", &inp);
freq [inp]++;
}
for (int i = 0; i < m; i++)
{
scanf ("%d", &inp);
freq [inp]--;
}
其中freq是具有一对整数的映射,而inp是一个普通整数。
答案 0 :(得分:4)
当您使用查找运算符[]
并且键不在映射中时,将使用该类型的值初始化值创建条目。在这种情况下,初始化的值int
初始化为零,初始值为0. ++
或--
然后对该值进行操作。
答案 1 :(得分:2)
我知道这些插入(及其差异):
Map[key] = value;
Map[key]
并非严格用于插入。您也可以分配给该值。 postincr / postdecr运算符会修改这些值,作为副作用。
所以Map[key]++
是合法的,并按照您的预期行事 - 增加Map[key]
中存储的值。相当于:
Map[key] = Map[key] + 1
答案 2 :(得分:0)
你可以显示你初始化freq的位置吗?如果freq是一对“int”,你需要用“freq [inp] .first”和“freq [inp] .second”来访问它们,据我所知“pair”没有重载+或 - 运算符。
for (int i = 0; i < n; i++)
{
scanf ("%d", &inp);
freq [inp]++;
}
这里,freq存储输入中找到整数的次数,如果输入为:0,0,0,1,1
map [0] = 3,map [1] = 2
for (int i = 0; i < m; i++)
{
scanf ("%d", &inp);
freq [inp]--;
}
同样,只是减去。
在这种情况下,你不能:
Map.insert(make_pair(key,val));
因为:
std::map<int, int> freq;
你说你的地图将整数作为“关键”而整数作为“价值”,不是“地图对”只是一张地图,本来就是一对地图如果你已初始化为 std :: map&gt;频率;
Map[Key] = Value;
如果这是一个竞争问题,我建议您只使用一个数组,将其大小设置为您需要的最大值,并根据需要将其初始化为0.