在C ++中,某些带有STL容器(如矢量,地图,字符串)的冒号可以通过for循环遍历。
例如:
for(auto c:v)
在编写自定义容器时,是否可以像Java(仅需要实现Iterable)那样遍历它?
答案 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;
}
};
如果您想知道当开始迭代器和结束迭代器应该相同时为什么会有T
和U
的情况。原因是某些容器没有相同类型的两个迭代器。
此外,您可以像这样实现辅助功能make_iterable
:
template <typename T, typename U>
iterable<T, U> make_iterable(T t, U u) {
return iterable<T,U>(t, u);
}