【发布时间】: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