В чем разница между итерацией и прохождением?

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

5 ответов


"обход" означает просто прохождение (всех или некоторых) элементов структуры данных.

исторически "итерация" в информатике-это особая форма рекурсии, для которой не требуется дополнительное пространство стека1 – иными словами, хвостовая рекурсия. Эта форма вычислительно точно эквивалентна тому, что мы теперь в просторечии знаем как "итерация", а именно конечному циклу (например,for петля с фиксированной нижней и верхней связанный.)

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

именно в этом контексте что термин "итерация" используется в C++ применительно к контейнерам.

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


1 в частности, это использование Джеральда Сассмана SICP славы.

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


примечание: Я только что сделал это определение, но оно соответствует моей ментальной модели, поэтому я иду с ним.

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

но итерация-это тип обхода. Поэтому каждая итерация-это обход, но не каждый обход-это итерация.


AFAIK они являются синонимами. Почему ты думаешь, что есть разница?

Я чувствую ;), что" траверс " иногда используется для указания на то, что используется внутренняя структура. Вы пересекаете дерево, переходя от parentnodes к childnodes, или вы пересекаете список, следуя следующим указателям.

массив с другой стороны, вы перебрать. У вас есть все элементы, просто прорабатывайте их один за другим.


Я бы назвал iterator "агента" и traverse "действие". На самом деле, меня часто смущает, когда люди ссылаются на traversing что-то как iterating над чем-то (потому что мне iteration связано с численными методами, которые сходятся к математической точке через итерацию). С другой стороны, даже я использую слова синонимы.

нельзя iterate над контейнерами, для которых нет понятия traversal. Как минимум, для того, чтобы traverse что-то, вы нужно знать хотя бы, есть ли у вас сосед, и как до него добраться.


итератор в основном дает вам функциональность для прохождения через datastructure-посещение каждого элемента. Я бы позвонил traversing и iterating синонимы. Есть iterators, но я не знаю traversers в программировании.

and why cannot you iterate through everything(STL datastructures)?

некоторые datastructures не имеют информации, которая позволяет это. Например, в стеке вы не сможете пересечь все элементы, потому что вы можете получить доступ только к верхней части стека.