Вопрос по – Различные типы итераторов

1

Существуют ли другие типы итераторов? Любые ссылки, которые показывают разные типы итераторов?

Единственный, кого я знаю, это .NET IEnumerable.

Особенно для C #, но все остальные тоже приветствуются.

Да, точно. , Joan Venge
Можете ли вы уточнить, что вы подразумеваете под другими "типами"? итераторов? Вы имеете в виду итераторы, которые по-разному пересекают структуры данных? dborba

Ваш Ответ

3   ответа
2

Очевидный пример чего-то большего, чем просто C # Iterator & quot; является итератором C ++, который в основном является маркером последовательности. В отличие от эквивалента C #, он не "знает" где последовательность начинается или заканчивается, она просто знает, на какой элемент она указывает в данный момент, и как получить следующий и, возможно, предыдущий элемент.

Эти итераторы обычно используются парами (обозначая начало / конец последовательности), например так:

std::vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
v.push_back(4);
v.push_back(5); // create a vector (equivalent to a C# List), and populate it with the numbers 1-5

// create two iterators, pointing to the beginning and end of this vector
std::vector<int>::iterator first = v.begin();
std::vector<int>::iterator last = v.end();

std::copy(first, last, std::ostream_iterator(std::cout)); // copy all elements found between first and last, to the standard output (in the shape of a special output iterator)

или если бы мы должны были пройти его вручную, мы бы сделали это:

for (vector<int>::iterator cur = v.begin(); cur != v.end(); ++cur) {
  int val = *cur; // get the value pointed to by the iterator
  cout << val; //  print that value to the standard output
}

Эффект от этого такой же, какstd::copy функция в первом примере, но здесь вы можете увидеть, как на самом деле используется итератор для перемещения по последовательности. Интересно то, что вы используете пару итераторов, поэтому вместо одного итератора с & quot; HasNext () & quot; & Quot; GetCurrent & Quot; и & quot; MoveForward & quot; функция (или аналогичная), у вас есть два итератора, и & quot; HasNext & quot; грубо говоря, заменяется тестом на равенство. Мы проверяем, равен ли итератор, который мы продвигаемся по последовательности, заданному конечному итератору. Если это так, мы знаем, что достигли конца последовательности.

Эти итераторы подразделяются на различные типы с различными возможностями. Итератор вектора принадлежит к категории итераторов произвольного доступа, что означает, что с любого итератора вы можете попасть куда угодно в последовательности за одну операцию с постоянным временем. Например, в приведенном выше примере, я могу получить от начала вектора до конца, выполнив это:

std::vector<int>::iterator last = v.begin() + 5; // advance 5 elements from begin

я также могу пойти назад

std::vector<int>::iterator first= v.end() - 5; // go 5 elements back from the end

Затем существуют двунаправленные итераторы, которые по-прежнему позволяют вам идти вперед и назад в последовательности, но только по одному элементу за раз (поэтому вместо операторов + и - у вас есть только ++ и -). Они используются для связанных списков, например. Нет способа пропустить, скажем, 5 элементов в постоянном времени в связанном списке, поэтому реализация связанного списка предоставляет только двунаправленные итераторы, а не произвольный доступ.

И это может быть дополнительно сужено до прямого итератора (который имеет только оператор ++.ostream_iterator выше пример этого. Поскольку он оборачивает поток, нет способа вернуться назад с таким итератором.

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

В частности, поскольку итераторы C ++ отделены от контейнеров, на которые они указывают, вы можете легко представить поддиапазоны (например, для обозначения первых трех элементов в приведенном выше векторе, я мог бы использовать пару итераторовv.begin(), v.begin() + 3, Другим примером являетсяfind функция, которая выполняет поиск в диапазоне итераторов и возвращает итератор, указывающий на найденный элемент:

std::vector<int>::iterator result = std::find(v.begin(), v.end(), 3);

В этом примере говорится, что поиск во всем диапазоне векторов для первого элемента имеет значение 3. Он возвращает итератор, указывающий на этот элемент (или конечный итератор, если результат не найден)

Этот итератор может быть в паре с теми, которые у нас уже были, поэтому, например, теперь мы можем искать в поддиапазоне между результатом поиска и концом последовательности:

std::vector<int>::iterator result2 = std::find(result + 1, v.end(), 3);

Таким образом, выше будет искатьnext элемент со значением 3, начиная с первого после первого результата поиска и заканчивая концом последовательности. Конечно, тогда элемент не будет найден, поэтому он возвращаетv.end().

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Joan Venge
Error: User Rate Limit Exceededstepanovpapers.comError: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Joan Venge
2

В Википедии есть отличная статья об итераторах:

In computer science, an iterator is an object that allows a programmer to traverse through all the elements of a collection, regardless of its specific implementation. An iterator is sometimes called a cursor, especially within the context of a database.

Также есть примеры кода на следующих языках:

C++ C# and other .NET languages Java Ruby Python PHP
Error: User Rate Limit Exceeded Joan Venge
1

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

Но на каждом языке вы застряли с их реализацией для встроенных объектов, и вы можете создать свою собственную реализацию для своих собственных объектов.

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