5

次のコードがあります。

set<Key> test;
test.insert(key1);
test.insert(key2);
iter1 = test.find(key1);
iter2 = test.find(key2);
test.erase(iter1);

私の質問は、key1 が削除された場合、iter2 を使用してテストで key2 を参照できますか?

ありがとう

4

3 に答える 3

7

はい、セットeraseは消去された要素を指すイテレータのみを無効にします (これは必ずしもすべてのコンテナに当てはまるわけではないことに注意してください)。

于 2011-06-19T14:25:08.283 に答える
3

関連付けられたコンテナー set、multiset、map、および multimap は、削除された要素へのイテレーターと参照を無効にするためだけに必要です。

両端キューでは、消去されたメンバーが両端キュー (23.2.1.3/4) の最後 (前または後) にない限り、すべての反復子と参照が無効になります。リストでは、消去された要素への反復子と参照のみが無効になります ( 23.2.2.3/3) および消去ポイントの後のすべての反復子と参照が無効化されるベクトル (23.2.4.3/3)

于 2011-06-19T14:43:52.140 に答える
3

厳密に言えば、「挿入」操作の戻り値をチェックし、key1key2が等しいことを確認する必要があります。それ以外の場合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
于 2011-06-19T14:37:54.240 に答える