自定义集合中的每个C ++

时间:2012-11-15 17:41:00

标签: c++ collections foreach loops

因此,自从它被引入以来,我一直喜欢for each关键字来迭代STL collections。(我非常喜欢语法糖)。

我的问题是如何编写可以使用这些关键字迭代的自定义集合?

基本上,我需要为我的集合公开哪些APi才能使用这些关键字进行迭代?

如果这听起来很生硬,我道歉,但请不要回答“使用提升”,“不要写自己的收藏品”等。我的朋友,追求知识。如果不可能,嘿,我可以处理。

我也非常希望不必将STL迭代器注入我的集合中。

提前致谢!

2 个答案:

答案 0 :(得分:10)

以下是可迭代数据结构(Range-Based loops)的一个很好的解释:

为了使数据结构可迭代,它必须与现有的STL迭代器类似地工作。

  1. 必须有beginend方法对该结构进行操作, 要么作为成员,要么作为独立函数,并将迭代器返回到 结构的开始和结束。
  2. 迭代器本身必须支持operator*方法,operator !=方法和operator++方法,无论是作为成员还是作为独立函数。
  3. 注意,在C++11中,在不使用STL的情况下,对基于范围的循环进行了集成支持,尽管上述条件也适用于此。你可以在上面的同一个链接上阅读它。

答案 1 :(得分:5)

您的问题并不是很清楚,您是否正在谈论std::for_each标头中定义的<algorithm>,或者C ++ 11中引入的基于范围的for循环

然而,两者的答案相似。

两者都在迭代器上运行,而不是集合本身。

所以你需要

  1. 定义一个迭代器类型,它满足STL(真正的C ++标准)对它的要求。 (主要的是它必须定义operator++operator*,以及其他一些操作和typedef)

  2. std::for_each,没有2.你已经完成了。您只需将两个这样的迭代器传递给std::for_each。对于基于范围的for循环,您需要通过begin()end()函数公开这对迭代器。

  3. 而且......那就是它。

    唯一棘手的部分是创建一个符合要求的迭代器。 Boost(即使你说你不想使用它)有一个库,它有助于实现自定义迭代器(Boost.Iterator)。还有std::iterator类,它用作自定义迭代器实现的基类。但这些都不是必要的。两者都只是方便工具,可以更容易地创建自己的迭代器。