您可以具有以下简单等效的Java Iterable
接口:
在C ++中,某些STL容器,例如矢量,映射,字符串,可以通过其中包含冒号的for循环来遍历。
例如:
for(auto c:v)
当我编写自定义容器时,是否可以像Java(只需要实现Iterable)那样遍历它?
是的,您需要实现某种形式的迭代器并覆盖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;
}
};
[如果您想知道为什么开始迭代器和结束迭代器相同时为什么会有T
和U
。原因是某些容器没有这两个相同类型的迭代器。
此外,您可以像这样实现一个辅助函数make_iterable
:
template <typename T, typename U>
iterable<T, U> make_iterable(T t, U u) {
return iterable<T,U>(t, u);
}
您可以具有以下简单等效的Java Iterable
接口: