STL итераторы - цель - PullRequest
       28

STL итераторы - цель

3 голосов
/ 15 июня 2010

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

Ответы [ 10 ]

24 голосов
/ 15 июня 2010

Итераторы позволяют вам отделять алгоритмы от контейнера. Если у вас есть начальный и конечный итератор и вы знаете его возможности (произвольный доступ и т. Д.), Вы можете выполнять операции в диапазоне, указанном итераторами. Например, см. std::for_each, std::transform. Таким образом, вы можете реализовать только одну версию алгоритма, а не писать новую для каждого контейнера, с которым вы хотите работать.

4 голосов
/ 15 июня 2010

Итераторы обеспечивают абстракцию. Не важно, как вы перемещаетесь по некоторому контейнеру для метода, который хочет работать только с его содержимым. Конечно, итераторы должны быть более универсальными, чем это. Вы хотите использовать самые быстрые из доступных операций, но при этом хотите написать общий код, или вы хотите, чтобы итераторы поддерживали вывод. Здесь появляются типовые черты. Это (в сочетании с концепциями) широко используется в STL. См. документацию SGI для обзора.

С другой стороны: итераторы не являются лучшим решением для всех видов проблем и поэтому часто обобщаются на диапазоны. (См. диапазон усиления для примера или это отличный разговор от boostcon.

4 голосов
/ 15 июня 2010

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

3 голосов
/ 15 июня 2010

Какие преимущества имеют итераторы STL?

  • Они позволяют вам абстрагироваться как вы итерируете значения из , что вы делаете с итеративными значениями допускает написание общих алгоритмов.

Пример:

std::vector<int> cont;
auto position = std::find(cont.begin(), cont.end(), 1); // forward search
auto position = std::find(cont.rbegin(), cont.rend(), 1); // backward search
  • Они позволяют реализовать безопасную разыменование (итератор может быть установлен нагенерировать исключение, если оно не указывает на допустимое значение и вы разыменовываете его), или любые другие проверки безопасности.

  • Они позволяют обрабатывать произвольные потоки как итеративные последовательности.

Это позволяет вам итерировать потоки ввода-вывода, например, писать код следующим образом:

std::vector<int> cont;
copy( cont.begin(), cont.end(), std::ostream_iterator<int>(std::cout, " ") );
2 голосов
/ 15 июня 2010

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

В C ++ это будет работать без проблем:

char buf1[3] = { 1, 2, 3 };
std::vector<char> buf2;
buf2.resize(sizeof(buf1));
std::copy( buf1, buf1+sizeof(buf1), buf2.begin() );
std::copy( buf2.begin(), buf2.end(), buf1 );
1 голос
/ 15 июня 2010

Основная причина для итераторов в STL состояла в том, что они позволяли писать алгоритмы независимо от способа хранения данных.Конечно, хранилище налагает (или, по крайней мере, может) накладывать некоторые ограничения, которые приводят к различным классам итераторов (например, RandomAccess или Input), но они (как предполагается, должны) быть максимально независимыми от базовой структуры данных.

Это позволяет, например, алгоритму merge принимать входные данные из vector и list и записывать выходные данные в ostream_iterator, не обращая внимания на различия междуисточники и / или место назначения.

1 голос
/ 15 июня 2010

Выглядит намного более взрослым, чтобы писать

vector<myclass>::iterator myClassVectorIterator;
for(myClassVectorIterator = myClassVector.begin(); 
        myClassVectorIterator != myClassVector.end();
        myClassVectorIterator++)

вместо

for (int i=0;i<size;i++) { ...
1 голос
/ 15 июня 2010

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

0 голосов
/ 15 июня 2010

Преимущества перед чем? Есть ли альтернатива, с которой вы хотите сравнить итераторы?

Целочисленные последовательности в стиле C, такие как for(i=0;i!=N;++i), предполагают, что стоимость произвольного доступа в контейнере, в частности стоимость доступа к элементу [i], ничтожно мала.

Аналогично, приращение указателя, например for(p=&arr[0]; p != p+N; ++p, предполагает, что реализация последовательности представляет собой непрерывный кусок памяти.

Были предложены альтернативы более высокого уровня, и многие из них были реализованы. Диапазоны, Perl-стиль "foreach", Lisp-стиль "apply".

0 голосов
/ 15 июня 2010

Это похоже на домашнее задание, однако ...

STL - это C ++. Итераторы облегчают обход списков вещей (обычно предоставляя некоторую магию STL для обработки типов вещей).

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