假设你有一个
std::unordered_set<std::shared_ptr<A>> as;
// (there is an std::hash<std::shared_ptr<A>> specialisation)
并且您想在迭代它时替换它的一些元素:
for (auto it = as.begin(); it != as.end(); ++it) {
if ((*it)->condition()) {
as.erase(it);
as.insert(std::make_shared<A>(**it));
}
}
这可能会使迭代器在erase
and处无效insert
(如果发生重新散列),因此此循环将表现出未定义的行为,并且很可能会严重崩溃。
我能想到的一种解决方案是使用两个单独vector
的 s 来缓冲insert
anderase
操作,然后使用采用迭代器对进行擦除和插入的重载(这可能对重新散列更友好)。
即使我使用缓冲区方法,这仍然看起来是臃肿的代码,并且可能导致两次重新散列,这可能都是不必要的。
那么,有没有更好的方法呢?