Итераторы STL гарантируют законность после того, как набор был изменен?

Короче говоря, вы должны иметь возможность открыть файл HTML в вашем браузере. Тем не менее, вы можете ничего не видеть (пусто), если ваш HTML не правильно отформатирован.

30
задан Midas 8 February 2014 в 14:38
поделиться

3 ответа

Зависит от контейнера. например если это вектор , после изменения контейнера все итераторы могут быть признаны недействительными. Однако, если это список , итераторы, не относящиеся к измененному месту, останутся действительными.

  • Итераторы вектора становятся недействительными, когда его память перераспределяется. Кроме того, вставка или удаление элемента в середине вектора делает недействительными все итераторы, которые указывают на элементы, следующие за точкой вставки или удаления. Отсюда следует, что вы можете предотвратить недействительность итераторов вектора, если вы используете reserve () для предварительного выделения того объема памяти, который будет когда-либо использовать вектор, и если все вставки и удаления находятся на конце вектора. [1]

  • Семантика аннулирования итератора для deque следующая. Вставка (включая push_front и push_back ) делает недействительными все итераторы, которые ссылаются на двухстороннюю очередь . Стирание в середине двухсторонней очереди делает недействительными все итераторы, которые ссылаются на двухстороннюю очередь . Удаление в начале или конце двухсторонней очереди (включая pop_front и pop_back ) делает итератор недействительным, только если он указывает на удаленный элемент. .[2]

  • List имеют важное свойство, заключающееся в том, что вставка и объединение не делают недействительными итераторы для элементов списка, и что даже удаление делает недействительными только итераторы, которые указывают на удаляемые элементы. [3]

  • Карта имеет важное свойство, заключающееся в том, что вставка нового элемента в карту не делает недействительными итераторы, указывающие на существующие элементы. Удаление элемента с карты также не делает недействительными итераторы, за исключением, конечно, итераторов, которые фактически указывают на удаляемый элемент. [4] (то же самое для set , multiset и multimap )

44
ответ дан 27 November 2019 в 23:49
поделиться

Это зависит от рассматриваемой коллекции. Например, изменение std::vector (например, добавление элемента куда-либо) может сделать недействительными все итераторы в этом векторе. В отличие от этого, с std::list итераторы остаются действительными, когда вы добавляете другой элемент в список. В некоторых случаях правила являются еще более сложными (например, если память служит с помощью std::deque, добавление в начало или конец оставляет существующие итераторы действительными, но добавление в любом другом месте может сделать их недействительными - но моя память недостаточно Вы должны проверить, прежде чем зависеть от этого).

8
ответ дан Jerry Coffin 27 November 2019 в 23:49
поделиться

Нет, итераторы хороши, только если итерируемый контейнер не изменился. Если коллекция изменена, итератор должен быть получен заново.

4
ответ дан 27 November 2019 в 23:49
поделиться
Другие вопросы по тегам:

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