次のループは、いくつかの述語pred
を満たすstd::unordered_map
から要素を消去する細かな方法であることを示唆しているStackOverflowの上のいくつかの答えがあります。消去要素
std::unordered_map<...> m;
auto it = m.begin();
while (it != m.end())
{
if (pred(*it))
it = m.erase(it);
else
++it;
}
私が特に興味C++ 11(C++ 14とは対照的に)、及び以下の不吉note on cppreference.com上記ループは未定義の動作に依存し、すべての後にC++ 11で動作しないことを示唆している:
ための消去されない要素は保存されます(thi SはC++ 14以降()コンテナを反復しながら、個々の要素を消去することが可能となる)
も参照してくださいTitle 2356. Stability of erasure in unordered associative containersページ754のWorking Draft N3797項目14に要求された文言の変更(追加のフレーズから始まるが含まれています"、相対的な順序を維持する...")。
この文言はN3797に関連しています。
修正[unord.req]、示されるように、P14:
-14-インサートと据え付けるメンバーは、コンテナ要素への参照の有効性に影響を与えてはならないが、 コンテナにすべてのイテレータを無効にすることができます。消去メンバーは、イテレーターと、消去されたエレメントへの参照を無効にし、消去されないエレメントの相対的な順序を に保持する。
私のcppreference.comからの注釈の解釈が正しい場合、上記のループはC++ 11の未定義の動作に依存しますが、C++ 11でこの問題を解決する最も効率的な方法は何ですか?
制約がそのように強化されたときに委員会のメンバーによって表されるすべてのコンパイラがすでに準拠しているため、通常、それはです。あなたは緊張するのは当然です。 –
@ MarkRansom安全な方法はありますか?つまり、C++ 11標準でこれを行う正しい方法は何ですか? – foxcub
私はそこに*安全であることが保証される方法ではないと思うので、標準への変更。 –