`std :: forward_list`走直到迭代器为空?

时间:2017-01-12 20:07:23

标签: c++11 traversal nullptr forward-list

是否可以遍历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,并引用列表的结尾。可悲的是,这种方法不存在。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

你没有。

std::forward_list是标准库容器。与所有容器一样,它从beginend。没有&#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