Будет ли функция стирания set в C ++ изменять адрес других элементов? - PullRequest
5 голосов
/ 19 июня 2011

У меня есть следующий код:

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

У меня вопрос: если ключ1 удален, могу ли я использовать iter2 для ссылки на ключ2 в тесте?

Спасибо

Ответы [ 3 ]

7 голосов
/ 19 июня 2011

Да, набор erase делает недействительными только итераторы, которые указывают на стертый элемент (обратите внимание, что это не обязательно верно для всех контейнеров).

3 голосов
/ 19 июня 2011

Набор асоциативных контейнеров, мультимножество, карта и мультикарта требуются только для аннулирования итераторов и ссылок на стертые элементы.

В deque все итераторы и ссылки становятся недействительными, если только стертые элементы не находятся в конце (передний или задний) deque (23.2.1.3/4), в списке недействительны только итераторы и ссылки на стертый элемент (23.2.2.3/3), а в векторе каждый итератор и ссылка после точки стирания недействительны (23.2.4.3/3)

3 голосов
/ 19 июня 2011

Строго говоря, вы должны проверить возвращаемое значение операции «вставка» и убедиться, что 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...