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

C++ for each in on custom collections

本文关键字:C++ 集合 自定义      更新时间:2023-10-16

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

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

本质上,我需要公开什么APi才能使用这些关键字使我的集合可迭代?

如果这听起来很直白,我很抱歉,但请不要用"使用boost"、"不要写你自己的收藏"等回应。追求知识,我的朋友们。如果不可能的话,嘿,我可以应付。

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

提前感谢!

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

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

  1. 必须存在对该结构进行操作的CCD_ 3和CCD_,作为成员或独立函数,并将迭代器返回结构的开始和结束
  2. 迭代器本身必须支持operator*方法、operator !=方法和operator++方法,无论是作为成员还是作为独立函数

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

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

然而,两者的答案是相似的。

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

所以你需要

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

  2. 对于std::for_each,不存在2。你完了。您只需将两个这样的迭代器传递给std::for_each。对于基于范围的For循环,需要通过begin()end()函数公开一对这样的迭代器。

而且。。。就是这样。

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