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

问题描述 投票:4回答:2

在C ++中,某些STL容器,例如矢量,映射,字符串,可以通过其中包含冒号的for循环来遍历。

例如:

for(auto c:v)

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

c++ c++11 traversal
2个回答
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循环。

您可以具有以下简单等效的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);
}

0
投票

您可以具有以下简单等效的Java Iterable接口:

© www.soinside.com 2019 - 2024. All rights reserved.