Похоже, что в соответствии с 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, особенно , если они в некотором смысле эквивалентны