【问题标题】:Does set insertion invalidates for each loop?每个循环的集合插入是否无效?
【发布时间】:2021-10-30 23:38:28
【问题描述】:

我们看下面的例子:

    set<int> candidates;
    for (int candidate : candidates) {
      if (candidate == target) {
        candidates.erase(target);
      }
    }

我想知道迭代器是否失效,并想知道它是否会影响 for-each 循环。

因为按照标准,在插入函数中说

没有迭代器或引用无效。

如果插入成功,则在节点句柄中保存的元素的指针和引用无效,并且在提取之前获得的对该元素的指针和引用有效。 (C++17 起)

【问题讨论】:

  • 您查看了insert,但您正在调用erase
  • 另请注意,如果您正在谈论擦除,则应将整个循环仅替换为candidates.erase(target);,这将是安全的(没有无效的迭代器)和高效的(O(log n)而不是 O(n))。
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c++ foreach insert set invalidation


【解决方案1】:

我想知道迭代器是否失效,

是的。 std::set::erase 使擦除元素的迭代器无效。

想知道它是否会影响 for-each 循环。

是的。如果在示例中调用 erase,则行为未定义。


循环是完全没有必要的。相反,您可以只调用一次 candidates.erase(target)


根据标准,在插入函数中它说:

当你不插入时,标准对插入函数的描述在很大程度上是无关紧要的。

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 2012-03-01
    • 2023-03-28
    • 2021-11-20
    • 2013-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多