这是我正在处理的一个简单脚本,但是我无法理解为什么它表现异常。
基本上,我有一个包含重复项的整数数组,我想将元素在数组中出现的次数以及该元素的值存储在unordered_map中,
然后,对于映射{ k,v }中的每个条目,我需要确定数组中是否存在k + 1,如果存在,则对其进行处理。您可以在下面看到代码。
vector<int> A = {1, 1, 3, 2, 5, 3};
for (int i = 0; i < A.size(); ++i) m[A[i]]++;
int ans = 0;
for (const auto& e: m) {
if (m[e.first + 1] > 0) ans = max(ans, e.second + m[e.first + 1]);
}
一切似乎都正常。但是,当unordered_map中不存在k + 1时,循环将终止,我不明白为什么。
根据c ++文档,operator []会插入一个新元素(如果不存在)。但这并不能告诉我有关循环不起作用的任何信息。
我怀疑这与我在循环内修改unordered_map有关。如果是这样,你们可以详细说明一下吗?
非常感谢您的帮助。
m[e.first + 1]
在循环内部使用时,m
如果不存在新元素,则会在其中插入一个新元素,这将给循环本身带来问题,因为基于范围的for
循环在内部使用迭代器,而使用迭代器std::unordered_map
在迭代过程中更改一段时间是未定义的行为,因为插入可能会使迭代器无效:
如果发生插入并导致容器的重新哈希,则所有迭代器均无效。否则,迭代器不会受到影响。引用没有无效。仅当新的元素数量大于时,才进行重新哈希处理
max_load_factor()*bucket_count()
。
为避免这种情况,请改用地图的find()
方法来检查键是否存在而无需插入它:
for (const auto& e: m) {
auto iter = m.find(e.first + 1);
if (iter != m.end()) ans = max(ans, e.second + iter->second);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句