【发布时间】:2020-07-08 11:57:18
【问题描述】:
我有 2 个数组,其中包含元素。我使用散列来获取每个元素出现多次的频率。 mapcheckA 包含第一个数组元素的频率,mapcheckB 包含另一个数组的频率。我正在尝试从两个无序地图中删除/擦除任何重复的元素。这是执行此操作的代码:
for (auto i : mapcheckA) {
if (mapcheckB.find(i.first) != mapcheckB.end()) {
if (i.second >=
mapcheckB.find(i.first)
->second) { // This block of code doesn't work as expected
i.second -= mapcheckB.find(i.first)->second;
mapcheckB.erase(i.first);
} else {
mapcheckB.find(i.first)->second -= i.second;
mapcheckA.erase(i.first);
}
}
}
for (auto i1 : mapcheckA) {
cout << i1.first << "\t" << i1.second << endl;
}
for (auto i : mapcheckB) {
cout << i.first << "\t" << i.second << endl;
}
当我以这样的方式输入元素时,第一个数组包含的元素频率比第二个数组中的频率高,如下所示:
arrayA = [ 1, 1, 1, 1, 4, 4 ]; // Here frequency of "1" is 4.
arrayB = [ 2, 2, 1, 1, 3, 3 ]; // Here frequency of "1" is 2.
在这种情况下,“if”条件下的代码块不会将频率从 1 更改为 2。 如果我更改数组的顺序,则代码可以正常工作。我在这里做错了什么?
【问题讨论】:
-
当我打印键值对时,对于上述 2 个数组,输出为: 对于 arrayA:
4 21 4对于 arrayB:3 22 2 -
在循环
for (auto i : mapcheckA)中,您正在对元素的副本进行操作,您的意思是要对实际对象 (for (auto& i : mapcheckA)) 的引用进行操作吗? -
@AlgirdasPreidžius 在
i之前在for (auto i: mapcheckA)中插入&后,问题就解决了。但我不明白为什么以及如何解决它。 -
@BennyK 但它工作正常。当第二个数组中某个元素的频率大于第一个时,输出是正确的。当第一个数组中的频率大于第二个时,我遇到了问题。
-
@Thomas Sablik - 抱歉,错过了“无序地图”部分。
标签: c++ arrays algorithm debugging unordered-map