В чем разница между доступом к векторным элементам с использованием итератора и индекса? - PullRequest
13 голосов
/ 28 мая 2009

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

Ответы [ 4 ]

8 голосов
/ 28 мая 2009

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

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

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

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

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

3 голосов
/ 28 мая 2009

Я говорю, его переносимость через контейнеры.

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

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

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

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

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

1 голос
/ 28 мая 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...