在循环中使用擦除它对于所有容器和平台总是安全的吗?

问题描述

我想根据特定条件删除容器内的元素(现在是 unordered_set

for (auto it = windows.begin(); it != windows.end(); ) {
    if ((*it)->closed() == 0)
        it = numbers.erase(it);
    else
        ++it;
}

我知道 erase(it) 会返回 the position immediately following the last of the elements erased. 但是

标准是否强制要求在调用 erase 时不会导致迭代重新排列?它对所有容器和所有平台总是安全的吗?假设某个平台内的某种类型的容器可能有一些神奇的实现。

解决方法

C++ 标准要求 unordered_set::erase 保留剩余元素的顺序,并在被擦除的元素之后立即返回迭代器。因此,您显示的循环是明确定义的。

[unord.req]/14 ... erase 成员应仅使迭代器和对已擦除元素的引用无效,并保留未擦除元素的相对顺序.

[unord.req]/11,Table 91 a.erase(q) 擦除 q 指向的元素。返回紧跟在擦除之前 q 之后的迭代器。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...