В STL почти все контейнеры имеют функцию стирания. Вопрос, который у меня есть, находится в векторе, функция стирания возвращает итератор, указывающий на следующий элемент в векторе. Контейнер карты этого не делает. Вместо этого он возвращает пустоту. Кто-нибудь знает, почему существует эта несогласованность?
STL-вектор против стирания карты
Ответ 1
См. http://www.sgi.com/tech/stl/Map.html
Карта имеет важное свойство, которое вставка нового элемента в карту не отменяет итераторов, которые указывают на существующие элементы. Стирание элемент с карты также не аннулировать любые итераторы, кроме конечно, для итераторов, которые на самом деле указывают на элемент, который стерта.
Причина возврата итератора при стирании заключается в том, что вы можете перебирать элементы стирания списка по мере продвижения. Если удаление элемента не приведет к аннулированию существующих итераторов, нет необходимости делать это.
Ответ 2
erase
возвращает iterator
в С++ 11. Это связано с отчет о дефектах 130:
В таблице 67 (23.1.1) указано, что container:: erase (iterator) возвращает итератор. В таблице 69 (23.1.2) говорится, что в дополнение к этому требованию ассоциативные контейнеры также говорят, что container:: erase (iterator) возвращает void. Это не дополнение; это изменение требований, которое приводит к тому, что ассоциативные контейнеры не соответствуют требованиям к контейнерам.
Комитет по стандартам принял это:
LWG соглашается, что тип возврата должен быть итератором, а не недействительным. (Согласен и Алекс Степанов).
(LWG = Библиотека рабочей группы).
Ответ 3
Несоответствие связано с использованием. vector
- последовательность, имеющая порядок над элементами. Хотя верно, что элементы в map
также упорядочены в соответствии с некоторым критерием сравнения, это упорядочение не видно из структуры. Нет эффективного способа перехода от одного элемента к другому (эффективное = постоянное время). На самом деле, перебирать карту довольно дорого; либо создание итератора, либо самого итератора предполагает прогулку по всему дереву. Это невозможно сделать в O (n), если не используется стек, и в этом случае требуемое пространство больше не является постоянным.
В общем, просто нет дешевого способа вернуть "следующий" элемент после стирания. Для последовательностей существует способ.
Кроме того, Роб прав. Нет необходимости, чтобы Карта возвращала итератор.
Ответ 4
Как и в стороне, STL, поставляемый с MS Visual Studio С++ (Dinkumware IIRC), предоставляет реализацию карты с помощью функции erase
, возвращающей итератор в следующий элемент.
Они отмечают, что это не соответствует стандартам.
Ответ 5
Я понятия не имею, является ли это ответом, но одна причина может заключаться в стоимости поиска следующего элемента. Итерация через карту по своей сути "медленная".