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

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

Итак, вот решение для Swift 4.x.

В didFinishLaunching:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

    FBSDKApplicationDelegate.sharedInstance()?.application(application, didFinishLaunchingWithOptions: launchOptions)

    return true
}

В открытом URL:

func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool {

    let handled = FBSDKApplicationDelegate.sharedInstance().application(app, open: url, sourceApplication: options[.sourceApplication] as? String, annotation: options[.annotation])
    return handled
}
13
задан Cœur 20 April 2018 в 12:17
поделиться

4 ответа

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

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

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

  • семантику, подобную указателю (подумайте о string :: итератор против char *).
  • Обобщенная концепция, применимая за пределами итерации по элементам внутри контейнер.
  • В некоторых случаях производительность выше, чем у функций-членов контейнера.
8
ответ дан 2 December 2019 в 00:03
поделиться

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

4
ответ дан 2 December 2019 в 00:03
поделиться

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

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

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

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

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

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

3
ответ дан 2 December 2019 в 00:03
поделиться

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

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

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

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

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