gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:58:03 26 4
gpt4 key购买 nike

这是我正在编写的一个简单脚本,但我无法理解为什么它的行为异常。

基本上,我有一个包含重复项的整数数组,我想将元素在数组中出现的次数以及元素的值存储在 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++ 文档,运算符 [] 会在新元素不存在时插入该元素。但这并没有告诉我有关循环不起作用的任何信息。

我怀疑这与我正在循环内修改 unordered_map 有关。如果是这样的话,你们能详细说明一下吗?

非常感谢您的帮助。

最佳答案

在循环内使用 m[e.first + 1] 会将新元素插入到 m 中(如果该元素不存在),这会导致循环本身出现问题因为range-based for loop在内部使用迭代器,并且在使用迭代器迭代时更改 std::unordered_map未定义行为,如 an insertion may invalidate the iterators :

If an insertion occurs and results in a rehashing of the container, all iterators are invalidated. Otherwise iterators are not affected. References are not invalidated. Rehashing occurs only if the new number of elements is greater than max_load_factor()*bucket_count().

为了避免这种情况,请使用 map 的 find()方法来检查 key 是否存在而不插入它:

for (const auto& e: m) {
auto iter = m.find(e.first + 1);
if (iter != m.end()) ans = max(ans, e.second + iter->second);
}

关于C++ - unordered_map 运算符 [],意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60961908/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com