次のコードがあります。
set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);
私の質問は、key1 が削除された場合、iter2 を使用してテストで key2 を参照できますか?
ありがとう
はい、セットerase
は消去された要素を指すイテレータのみを無効にします (これは必ずしもすべてのコンテナに当てはまるわけではないことに注意してください)。
関連付けられたコンテナー set、multiset、map、および multimap は、削除された要素へのイテレーターと参照を無効にするためだけに必要です。
両端キューでは、消去されたメンバーが両端キュー (23.2.1.3/4) の最後 (前または後) にない限り、すべての反復子と参照が無効になります。リストでは、消去された要素への反復子と参照のみが無効になります ( 23.2.2.3/3) および消去ポイントの後のすべての反復子と参照が無効化されるベクトル (23.2.4.3/3)
厳密に言えば、「挿入」操作の戻り値をチェックし、key1
とkey2
が等しいことを確認する必要があります。それ以外の場合iter1 == iter2
、消去はiter1
無効になりiter2
ます。しかし、一般的には前の回答を参照してください。イテレータを消去すると、そのイテレータのみが無効になり、他は無効になりません。
例:
struct Foo
{
Foo(std::string s = "") : s(s) { }
bool operator<(const Foo & other) { return s.size() < other.size(); }
}
std::set<Foo> x;
x.insert(Foo("Cat"));
x.insert(Foo("Dog")); // booboo