3

所以自从它被介绍以来,我一直喜欢for eachin 关键字来迭代STL collections。(我非常非常喜欢语法糖)。

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

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

如果这听起来很生硬,我深表歉意,但请不要用“使用 boost”、“不要编写自己的集合”等来回应。求知啊朋友们。如果不可能,嘿,我可以处理。

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

提前致谢!

4

2 回答 2

10

这是对可迭代数据结构(基于范围的循环)的一个很好的解释:

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

  1. 必须有beginend方法对该结构进行操作,无论是作为成员还是作为独立函数,并且将迭代器返回到结构的开头和结尾。
  2. 迭代器本身必须支持一个operator*方法、一个operator !=方法和一个operator++方法,无论是作为成员还是作为独立函数。

请注意,在C++11不使用 的情况下集成了对基于范围的循环的支持STL,尽管上述条件也适用于此。您可以在上面的同一链接中阅读它。

于 2012-11-15T17:47:43.607 回答
5

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

但是,两者的答案是相似的。

两者都对迭代器进行操作,而不是对集合本身进行操作。

所以你需要

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

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

而且……就是这样。

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

于 2012-11-15T17:47:36.447 回答