あなたが持っているとしましょう
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
insert
私が考えることができる1つの解決策は、2つの別々のを使用してand操作vector
をバッファリングし、後でイテレータペアを使用して消去と挿入を行うオーバーロードを使用することです(これはおそらく再ハッシュに適しています)。insert
erase
バッファアプローチを使用したとしても、これはまだ肥大化したコードのようであり、2回の再ハッシュが発生する可能性があり、両方とも不要になる可能性があります。
それで、それをするより良い方法はありますか?