是否可以遍历std::forward_list
,递增迭代器,直到所述的interator为空?老式的方式......
在以下示例中,我创建了一个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
业务。
我的第一个倾向是寻找一种方法来检查迭代器是否为null,并引用列表的结尾。可悲的是,这种方法不存在。
有什么想法吗?
答案 0 :(得分:2)
你没有。
std::forward_list
是标准库容器。与所有容器一样,它从begin
到end
。没有&#34; null&#34;迭代器。因此,操作在一系列迭代器上。
请注意,范围TS提案打算允许&#34; sentinel&#34;类型而不是需要结束迭代器。单个标记可以比较等于任何范围的结束迭代器。所以forward_list
确实可以更新为具有这样的值。
但它仍然不会成为&#34; null&#34;迭代器。
答案 1 :(得分:0)
您应该意识到迭代器对象不完全是指针。它是一个对象,它表示数据结构中项目的位置。 增加结束迭代器也不会导致null迭代器。这是未定义的行为。看Can an STL map iterator go out of bounds through incrementing?
答案 2 :(得分:0)
在列表末尾,迭代器不为null,而是等于列表的 end iterator fl.end()
。所以两个迭代器都需要传递给函数。
迭代器的内部实现取决于所使用的STL库,对于std::forward_list
,它的接口符合ForwardIterator
概念:http://en.cppreference.com/w/cpp/concept/ForwardIterator。