В чем разница между доступными векторными элементами с использованием итератора и индекса?

Какие преимущества существуют при доступе к векторным элементам с использованием итератора по индексу?

Ответ 1

Почему итераторы лучше индексов?

  • В тех случаях, когда индекс недоступен (например, с помощью std:: list, для пример).
  • В случае, когда общая функция, принимающая итератор вызывается.
  • При написании шаблона функции, который должен работать с более одного типа контейнера.
  • Они существуют для создания однородности среди всех контейнеров и возможности использования итераторы всех контейнеров, а также обычные указатели во всех стандартах алгоритмы.
  • Итераторы могут указывать на последовательности, которые не существуют, кроме как понятие. Например, вы можете создать класс итератора, который выполняет числа, фактически не создавая контейнер простых чисел.

Однако, если игнорировать типы контейнеров, которые не поддерживают произвольный доступ (список, набор и т.д.), итераторы все еще предлагают

  • Указатель, как семантика (подумайте о строке:: итераторе и char *).
  • Обобщенная концепция, используемая вне итерации над элементами внутри контейнер.
  • Лучше производительность, чем функции-члены контейнера, в нескольких случаях.

Ответ 2

Модульность - это ответ. Предположим, вы завершаете свою логику в вызове функции (хорошая практика). В этом случае получение этого итератора сделает его общим, так что оно может работать с массивом стилей C (указатель), вектором stl С++ или с чем-либо на самом деле, который ведет себя как контейнер итератора, например, связанный список.

Ответ 3

Я говорю о его переносимости в контейнерах.

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

typedef std::vector<int> myContainer; //only change here for std::list 

for ( myContainer::iterator iter = actualContainer.begin();
      iter != actualContainer.end(); 
      ++iter)
{}

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

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

Ответ 4

Этот вопрос недавно задал мне вопрос о производительности. Вы можете взглянуть на ответы, которые я получил.

Проверьте следующую ссылку: Итераторы против индексов

В основном речь шла о производительности, которая оказалась зависимой от платформы, с незначительными изменениями на каждой платформе.