2016-10-20 3 views
1

Как новичок C++, я просто открываю итераторы. Я понимаю, что для любого цикла можно использовать либо int, либо iterators. Рассмотрим, напримерРазличия между циклами с целым числом или итератором в C++

#include <iostream> 
#include <vector> 

int main() 
{ 
    std::vector<int> v; 
    v.push_back(1); 
    v.push_back(4); 
    v.push_back(8); 

    std::cout << "i is an int: "; 
    for (int i = 0; i<v.size();i++) 
    { 
     std::cout << v[i] << " "; 
    } 
    std::cout << std::endl; 

    std::cout << "i is an iterator: "; 
    for (std::vector<int>::iterator i = v.begin(); i!=v.end();i++) 
    { 
     std::cout << *i << " "; 
    } 
    std::cout << std::endl; 
} 

, который выводит

i is an int: 1 4 8                                 
i is an iterator: 1 4 8 

Вообще говоря,

  • есть какие-либо преимущества использования одного или другого метода?
  • Один быстрее, чем другой?
  • Когда следует использовать int и когда следует использовать iterator?
+1

Обратите внимание, что с C++ 11 у вас есть даже диапазон: 'for (int e: v) {std :: cout << e <<" "; } ' – Jarod42

+1

И вы также можете сделать' auto i = v.begin() ', поэтому вам не нужно указывать (относительно сложное) имя типа – ForceBru

+0

. Версия' int' не может быть обобщена во всех контейнерах ('list',' set' и т. д.), в то время как итераторы (и диапазон, основанный на выше) могут быть. – Chad

ответ

2

Основной причиной итераторов является предоставление общностью. В частности, общий алгоритм может пройти множество контейнеров с использованием итератора, тип которого передается в качестве параметра шаблона:

template <class InIt> 
void print(InIt b, InIt e) { 
    while (b != e) { 
     std:cout << *b << ' '; 
     ++b; 
    } 
} 

В этом случае вы получаете преимущество от итератора, потому что вы можете напечатать list или map (чтобы дать только пару примеров), а также vector.

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

Для случая вы показали, однако, вы, вероятно, хотите, чтобы рассмотреть диапазон на основе for цикла, чтобы избежать использования либо индекса или итератор:

for (auto i : v) 
    std::cout << i << ' '; 

1. Примечание что, хотя это справедливо и для стандартных итераторов, - это, чтобы создать тип итератора, который остается в силе в такой ситуации, если вам действительно нужно/нужно. Например: https://stackoverflow.com/a/7958561/179910

1

Иногда ваш алгоритм будет нужен индекс, и в этом случае использовать int или size_t, чтобы отслеживать индекс. В противном случае используйте итератор. Также обратите внимание, что некоторые контейнеры могут пересекаться только с помощью итератора; list, map и т. Д.

0

Итераторы более общие. Вы можете использовать итераторы для перебора последовательностей, которые не могут быть обоснованно проиндексированы (поэтому есть несколько std::iterator categories). Например, стандартный ввод может быть повторен с istream_iterator, а std::list не поддерживает индексы.

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

Это говорит о том, что использование итераторов является повсеместным в современном C++, и это не плохой дефолт, тем более, что вы можете использовать вывод типа, чтобы не называть раздражающе длинные типы.

При использовании сырья петли вместо алгоритмов, предпочитают ranged-for петли к петлям старого стиля:

for(auto const& elem : range){ 
    //... 
} 
0

Similar question already exists Позвольте мне ответить вам вопросы по одному: есть какие-либо преимущества использования одного или другого метода? Когда следует использовать int и когда следует использовать итератор? Иногда вы не можете использовать целое число, и вам нужно использовать итератор! Однако итератор, как правило, медленнее целого.

What are the best and common practices? 

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

Смежные вопросы