这是我正在使用的简单脚本,但是我无法理解为什么它表现出意外。
[基本上,我有一个重复的整数数组,我想将元素在数组中出现的次数以及元素的值存储在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]);
}
似乎一切正常。但是,当k + 1在unordered_map中不存在时,循环将终止,我不明白为什么。
根据c ++文档,操作员[]会插入一个不存在的新元素。但这并不能告诉我有关循环的任何信息,只是无法正常工作。
我怀疑这与我在循环内修改unordered_map有关。如果是这样,你们可以详细说明一下吗?
非常感谢您的帮助。
在循环内使用m[e.first + 1]
会将新元素插入m
,如果该元素不存在,则会导致循环本身出现问题。 range-based for
loop在内部使用迭代器,而使用迭代器迭代容器时更改容器是undefined behavior。
使用for
代替检查是否存在:
m.find(e.first + 1)