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