Почему std :: set <K, C, A> :: erase не берет const_iterator? - PullRequest
5 голосов
/ 13 июля 2011

Похоже, что в соответствии с ISO 14882 2003 (он же Священный стандарт C ++) std::set<K, C, A>::erase принимает iterator в качестве параметра (не const_iterator)

из 23.3.3 [2]

void erase(iterator position);

Также следует отметить, что в моей реализации STL, поставляемой с VS2008, стирание занимает const_iterator, что привело к неприятному удивлению, когда я попытался скомпилировать свой код с другим компилятором. Теперь, поскольку моя версия занимает const_iterator, тогда можно реализовать стирание с const_iterator (как будто это не было самоочевидным).

Полагаю, комитет по стандартам имел в виду некоторую реализацию (или уже имеющуюся реализацию), которая потребовала бы стирания, чтобы получить iterator.

  • Если вы согласны с этим, Не могли бы вы описать реализацию set::erase, которая потребовала бы изменения элемента, который должен был быть удален (могу «т).
  • Если вы не согласны, скажите, пожалуйста, с какой стати они примут такое решение? Я имею в виду, стирание элемента - это просто перестановка указателей!

EDIT

Мне просто пришло в голову, что даже в случае итератора нельзя изменить элемент в наборе. Но все еще остается вопрос - почему бы не const_iterator, особенно , если они в некотором смысле эквивалентны

Ответы [ 3 ]

4 голосов
/ 14 июля 2011

Это был дефект. Поскольку C ++ 11, set<K,C,A>::erase занимает const_iterator:

iterator erase(const_iterator position);

Эта статья 2007 года проиллюстрировала эту ошибку и продемонстрировала реализации, позволяющие ее избежать. Я не уверен, является ли эта статья причиной изменения стандарта, но это, вероятно, хорошая догадка.

0 голосов
/ 14 июля 2011

Не могу придумать причину, по которой нужно и iterator, поэтому я склоняюсь к произвольному: любая операция, которая изменяет структуру, потребует iterator, чтобы позволить пользователь знает, что то, что раньше работало с iterator, может и не работать:

  • erase делает недействительным итератор.
  • insert(iter, val) меняет следующее значение.
  • и т.д.
0 голосов
/ 14 июля 2011

Мое единственное предположение состоит в том, что insert , upper_bound , lower_bound и find возвращают итератор (не постоянный итератор).Я не вижу другого объяснения.

...