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

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