Вектор STL по сравнению со стиранием карты

Создайте новый пакет внутри папки SRC, а затем перетащите свой файл класса в новый пакет. Так что имя пакета по умолчанию будет изменено

14
задан Craig H 18 September 2008 в 22:57
поделиться

5 ответов

См. http://www.sgi.com/tech/stl/Map.html

, Карта имеет важное свойство, что вставка нового элемента в карту не делает недействительным итераторы, которые указывают на существующие элементы. Стирание элемента из карты также не делает недействительным итераторов, кроме, конечно, для итераторов, которые на самом деле указывают на элемент, который стирается.

причина возврата итератора на стирании состоит в том так, чтобы можно было выполнить итерации по списку, стирающему элементы, когда Вы идете. Если стирание объекта не делает недействительным существующие итераторы нет никакой потребности сделать это.

26
ответ дан 1 December 2019 в 06:28
поделиться

Так же, как в стороне, STL, поставленный с Visual Studio MS, C++ (Dinkumware IIRC) предоставляет реализации Map erase функция, возвращая итератор следующему элементу.

Они отмечают, что это не приспосабливание стандартов.

3
ответ дан 1 December 2019 в 06:28
поделиться

Несоответствие должно использовать. vector последовательность, имеющая упорядочивание по элементам. В то время как это верно, что элементы в map также заказаны согласно некоторому критерию сравнения, это упорядочивание неочевидно из структуры. Нет никакого эффективного способа стать от одного элемента до следующего (эффективным = постоянное время). На самом деле для итерации по карте является довольно дорогим; или создание итератора или сам итератор включают техническую победу полное дерево. Это не может быть сделано в O ( n), если стек не используется, в этом случае требуемое пространство больше не является постоянным.

, В целом, просто нет никакого дешевого способа возвратить “next” элемент после стирания. Для последовательностей, там путь.

Кроме того, Грабят, является правильным. Нет никакой потребности в Карте для возврата итератора.

5
ответ дан 1 December 2019 в 06:28
поделиться

erase возвраты iterator в C++ 11. Это происходит из-за дефектный отчет 130 :

Таблица 67 (23.1.1) говорит что контейнер:: стирание (итератор) возвращает итератор. Таблица 69 (23.1.2) говорит, что в дополнение к этому требованию, ассоциативные контейнеры также говорят что контейнер:: стирание (итератор) возвращается пусто. Это не дополнение; это - изменение в требованиях, которое имеет эффект того, чтобы заставлять ассоциативные контейнеры не удаться отвечать требованиям для контейнеров.

комитет по стандартам принял это:

LWG соглашается, что тип возврата должен быть итератором, не пусто. (Alex Stepanov соглашается также.)

(LWG = Рабочая группа Библиотеки).

12
ответ дан 1 December 2019 в 06:28
поделиться

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

1
ответ дан 1 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: