使用C++ for each循环遍历自定义集合

3
自从引入了for each关键字来迭代STL collections后,我一直很喜欢它(我非常喜欢语法糖)。 我的问题是,我如何编写自定义集合以使用这些关键字进行迭代? 基本上,我需要公开哪些API才能使用这些关键字迭代我的集合?如果听起来很直白,我很抱歉,请不要回答“使用boost”、“不要编写自己的集合”或类似的话。我们追求知识,朋友们。 如果不可能,嘿,我可以接受。 我也非常不想将STL迭代器注入到我的集合中。 预先感谢!

1
你是在说 std::for_each 算法吗?还是 C++11 中引入的基于范围的 for 循环? - jalf
@jalf:我指的是微软的“for each in”上下文关键字。虽然MSDN页面只详细介绍了C++/CLI,但这也适用于本地环境。 - Will Custode
2个回答

10

以下是关于可迭代数据结构的良好解释(范围-based循环):

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

  1. 必须有在该结构上操作的 beginend 方法,可以作为成员或作为独立函数,并返回指向该结构开头和结尾的迭代器。
  2. 迭代器本身必须支持 operator* 方法、operator != 方法和 operator++ 方法,可以作为成员或作为独立函数。

注意,在 C++11 中有一个集成的支持用于范围-based循环而不使用 STL 的功能,尽管上述条件同样适用。您可以在上面提供的相同链接中阅读有关它的信息。


太完美了!谢谢你。这正是我所需要的那种信息。 - Will Custode
你能添加一些链接来证实/解释这个语句吗:“注意,在C++11中,有一个集成支持范围-based循环而不使用STL的功能”? - NicoBerrogorry
@NicoBerrogorry 谷歌是你的好朋友。输入“C++11基于范围的循环”。 - SomeWittyUsername
实际上,我在发表评论后立即就做到了,并找到了我需要的材料。无论如何,我需要的一切已经在你提供的第一个链接中得到了解释,看来我匆忙地阅读了你的回答... - NicoBerrogorry

5
从你的问题中并不清楚你是在谈论定义在头文件中的std::for_each,还是在C++11中引入的基于范围的for循环。
然而,对于两者的答案都相似。
两者都操作迭代器,而不是集合本身。
所以你需要:
1. 定义一个符合STL要求的迭代器类型(实际上是C++标准)。 (主要是它必须定义operator ++和operator *,以及一些其他操作和typedefs) 2. 对于std :: for_each,没有第二步。 你完成了。 你只需将两个这样的迭代器传递给std :: for_each。 对于基于范围的for循环,您需要通过begin()和end()函数公开一对这些迭代器。 这就是全部内容。
唯一棘手的部分实际上是创建符合要求的迭代器。 Boost(即使您说您不想使用它)有一个库可帮助实现自定义迭代器(Boost.Iterator)。 还有std :: iterator类,旨在作为自定义迭代器实现的基类。 但是,这两个都不是必要的。 两者都只是方便工具,使创建自己的迭代器更容易。

std::iterator在C++17中已被弃用。 - Maks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接