Возможно ли пройти std::forward_list
, увеличивая итератор до тех пор, пока указанный интернатор не станет нулевым? Старомодный способ ...`std :: forward_list` до тех пор, пока итератор не станет нулевым?
В следующем примере я создаю функцию print()
.
#include <iostream>
#include <forward_list>
void print(std::forward_list<int>::iterator fl_it, std::forward_list<int>::iterator e) {
while (fl_it != e) {
std::cout << *fl_it << ' ';
++fl_it;
}
std::cout << std::endl; //-> 1 2 3
}
int main() {
std::forward_list<int> fl = {1, 2, 3};
print(fl.begin(), fl.end());
std::cout << std::endl;
return 0;
}
Обратите внимание, как прохождение итератор, указывающий на конец списка, необходимо, чтобы мы знали, когда остановиться ходьбу.
То, что я хочу сделать, это просто передать итератор к главе списка, и шаг за шагом вперед, пока нет больше элементов, например, так:
void print(std::forward_list<int>::iterator fl_it) {
while (fl_it != nullptr) {
std::cout << *fl_it << ' ';
++fl_it;
}
std::cout << std::endl;
}
Мой компилятор не нравится это fl_it != nullptr
бизнес ,
Моим первым наклонением было найти способ проверить, является ли итератор нулевым, и ссылается на конец списка. К сожалению, такого метода не существует.
Любые идеи?
Думайте об этом так: если бы у вас был первый элемент массива и никакой другой информации, можете ли вы дойти до конца? – AndyG
И вы могли бы * определить * конец, когда вы пришли к нему? – jaggedSpire
Следует отметить, что * есть * некоторые типы итераторов, которые * вид * имеют эту функцию - 'std :: istream_iterator', для одного есть конструктор 'istream &' и конструктор по умолчанию. Построенный по умолчанию итератор действует как конечный итератор для диапазона, а построенный итератором istream будет сравниваться с итератором, построенным по умолчанию, когда он встречает конец обернутого istream. Таким образом, вы можете передать 'istream_iterator' в функцию и просто построить в нем конечный итератор. Но это не относится ко многим типам итераторов. – jaggedSpire