C ++-unordered_map运算符[],意外行为

问题描述 投票:0回答:1

这是我正在使用的简单脚本,但是我无法理解为什么它表现出意外。

[基本上,我有一个重复的整数数组,我想将元素在数组中出现的次数以及元素的值存储在unordered_map中,

然后,对于映射{kv}中的每个条目,我需要确定数组中是否存在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有关。如果是这样,你们可以详细说明一下吗?

非常感谢您的帮助。

c++ loops unordered-map
1个回答
2
投票

在循环内使用m[e.first + 1]会将新元素插入m,如果该元素不存在,则会导致循环本身出现问题。 range-based for loop在内部使用迭代器,而使用迭代器迭代容器时更改容器是undefined behavior

使用for代替检查是否存在:

m.find(e.first + 1)
© www.soinside.com 2019 - 2024. All rights reserved.