问题描述
我想根据特定条件删除容器内的元素(现在是 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
之后的迭代器。