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

JhonRayo99

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

基本上,我有一个包含重复项的整数数组,我想将元素在数组中出现的次数以及该元素的值存储在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]);
}

一切似乎都正常。但是,当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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

重载运算符“ <<” c ++的意外行为

来自分类Dev

在C ++中如何在const unordered_map上使用“ []”运算符来解决?

来自分类Dev

为什么运算符==对于std :: unordered_map而言还不够?-C ++

来自分类Dev

C#+运算符的奇怪行为

来自分类Dev

C ++指针,++运算符行为

来自分类Dev

布尔运算符的意外行为

来自分类Dev

C ++ chrono意外行为

来自分类Dev

c ++ chrono意外行为

来自分类Dev

为UDF std :: unordered_map提供“:”运算符?

来自分类Dev

IAR C / C ++比较运算符的行为

来自分类Dev

C ++运算符new返回意外值

来自分类Dev

C ++ unordered_map问题

来自分类Dev

C ++ unordered_map的问题

来自分类Dev

Ternery运算符在C ++中的奇怪行为

来自分类Dev

重载C ++赋值运算符的行为类似于Java

来自分类Dev

C ++中三元运算符的异常行为

来自分类Dev

C中“,”运算符的行为不清楚

来自分类Dev

Ternery运算符在C ++中的奇怪行为

来自分类Dev

C ++运算符[]

来自分类Dev

C ++运算符“?:”

来自分类Dev

C语言中结构的意外行为

来自分类Dev

C ++在ubuntu上的意外行为

来自分类Dev

c++ winapi SendInput意外行为

来自分类Dev

c ++获取unordered_map向量的unordered_map值

来自分类Dev

EL-Conditional运算符?:复合组件中的意外行为

来自分类Dev

结合使用增量运算符和指针解引用时的意外行为

来自分类Dev

使用<<运算符到数组中的特定索引中的意外行为

来自分类Dev

Elixir 中重新分配变量的意外行为(绑定运算符)

来自分类Dev

使用三元运算符 (Verilog) 的意外行为