Почему std:: set<K, C, A>:: erase не берет const_iterator?

Похоже, что в соответствии с 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 который потребовал бы изменить элемент, который собирался быть удаленным (я не могу).
  • Если вы не согласны, скажите, пожалуйста, с какой стати они пришли к такому решению? Я имею в виду, стирание элемента - это просто перестановка указателей!

РЕДАКТИРОВАТЬ

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

3 ответа

Решение

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

iterator erase(const_iterator position);

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

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

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

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

Другие вопросы по тегам