Почему 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 итератор). Я не вижу другого объяснения.