使用基于范围的for循环自定义容器遍历

时间:2020-05-03 07:21:29

标签: c++ c++11 traversal

在C ++中,某些带有STL容器(如矢量,地图,字符串)的冒号可以通过for循环遍历。

例如:

for(auto c:v)

在编写自定义容器时,是否可以像Java(仅需要实现Iterable)那样遍历它?

2 个答案:

答案 0 :(得分:5)

是的,您需要实现某种形式的迭代器并覆盖std :: begin(container)和std :: end(container)(如果您的容器具有begin和end方法,则可能也可以工作)。

在内部,代码等效于以下内容(这只是为了说明要点,编译器可以略微不同地编写它,有关更多详细信息,请参见here)。

auto _end = end(v);
for (auto _it = begin(v); _it != _end; ++_it) {  
    auto c = *_it;
    <the rest of loop code>
}

因此,如果您的迭代器和重写按预期工作,它将同样适用于for循环。

答案 1 :(得分:0)

您可以使用以下等效于Java Iterable的接口:

template <typename T, typename U>
struct iterable {
    T _begin;
    U _end;

    iterable(T begin, U end)
        : _begin(begin),
          _end(end)
    {}

    T begin() {
        return _begin;
    }

    U end() {
        return _end;
    }
};

如果您想知道当开始迭代器和结束迭代器应该相同时为什么会有TU的情况。原因是某些容器没有相同类型的两个迭代器。

此外,您可以像这样实现辅助功能make_iterable

template <typename T, typename U>
iterable<T, U> make_iterable(T t, U u) {
    return iterable<T,U>(t, u);
}