因此,自从它被引入以来,我一直喜欢for each
关键字来迭代STL collections
。(我非常喜欢语法糖)。
我的问题是如何编写可以使用这些关键字迭代的自定义集合?
基本上,我需要为我的集合公开哪些APi才能使用这些关键字进行迭代?
如果这听起来很生硬,我道歉,但请不要回答“使用提升”,“不要写自己的收藏品”等。我的朋友,追求知识。如果不可能,嘿,我可以处理。
我也非常希望不必将STL迭代器注入我的集合中。
提前致谢!
答案 0 :(得分:10)
以下是可迭代数据结构(Range-Based loops)的一个很好的解释:
为了使数据结构可迭代,它必须与现有的STL迭代器类似地工作。
begin
和end
方法对该结构进行操作,
要么作为成员,要么作为独立函数,并将迭代器返回到
结构的开始和结束。operator*
方法,operator !=
方法和operator++
方法,无论是作为成员还是作为独立函数。注意,在C++11
中,在不使用STL
的情况下,对基于范围的循环进行了集成支持,尽管上述条件也适用于此。你可以在上面的同一个链接上阅读它。
答案 1 :(得分:5)
您的问题并不是很清楚,您是否正在谈论std::for_each
标头中定义的<algorithm>
,或者C ++ 11中引入的基于范围的for循环
然而,两者的答案相似。
两者都在迭代器上运行,而不是集合本身。
所以你需要
定义一个迭代器类型,它满足STL(真正的C ++标准)对它的要求。 (主要的是它必须定义operator++
和operator*
,以及其他一些操作和typedef)
std::for_each
,没有2.你已经完成了。您只需将两个这样的迭代器传递给std::for_each
。对于基于范围的for循环,您需要通过begin()
和end()
函数公开这对迭代器。
而且......那就是它。
唯一棘手的部分是创建一个符合要求的迭代器。 Boost(即使你说你不想使用它)有一个库,它有助于实现自定义迭代器(Boost.Iterator)。还有std::iterator
类,它用作自定义迭代器实现的基类。但这些都不是必要的。两者都只是方便工具,可以更容易地创建自己的迭代器。