Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;对于自定义集合中的每个_C++_Collections_Foreach_Loops - Fatal编程技术网

C++ C++;对于自定义集合中的每个

C++ C++;对于自定义集合中的每个,c++,collections,foreach,loops,C++,Collections,Foreach,Loops,因此,自从它被引入以来,我一直喜欢在关键字中为每个迭代STL集合(我非常非常喜欢语法糖) 我的问题是如何编写可以使用这些关键字进行迭代的自定义集合 本质上,我需要公开什么APi才能使我的集合使用这些关键字进行编辑 如果这听起来很直白,我很抱歉,但请不要用“使用boost”、“不要编写自己的收藏”之类的回答。追求知识,我的朋友们。如果不可能,嘿,我能处理 我也非常希望不必将STL迭代器注入到我的集合中 提前谢谢 从您的问题中不清楚您是在谈论标题中定义的std::for\u每个,还是C++11中引入

因此,自从它被引入以来,我一直喜欢在关键字中为每个迭代
STL集合
(我非常非常喜欢语法糖)

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

本质上,我需要公开什么APi才能使我的集合使用这些关键字进行编辑

如果这听起来很直白,我很抱歉,但请不要用“使用boost”、“不要编写自己的收藏”之类的回答。追求知识,我的朋友们。如果不可能,嘿,我能处理

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


提前谢谢

从您的问题中不清楚您是在谈论
标题中定义的
std::for\u每个
,还是C++11中引入的基于范围的for循环

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

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

所以你需要

定义一个迭代器类型,满足STL(C++标准,真正地)对它的要求。(主要是它必须定义

操作符+++
操作符*
,以及一些其他操作和typedef)

  • 对于
    std::对于每个
    ,没有2。你完了。只需将两个这样的迭代器分别传递给
    std::for\u
    。对于基于范围的For循环,需要通过
    begin()
    end()
    函数公开一对迭代器

  • 而且。。。就这样


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

    下面是对iterable数据结构()的一个很好的解释:

    为了使数据结构可移植,它必须与现有的STL迭代器类似

  • 必须有对该结构进行操作的
    begin
    end
    方法, 作为成员或独立函数,并将迭代器返回到 结构的开始和结束
  • 迭代器本身必须支持
    运算符*
    方法,即
    运算符=方法和
    操作符+
    方法,作为成员或独立函数

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

    您是在谈论
    std::for_each
    算法吗?还是C++11中引入的基于范围的for循环?@jalf:我指的是Microsoft的“for each in”上下文敏感关键字。虽然只有C++/CLI的细节,但它在native.Perfect中工作!非常感谢。这正是我所需要的信息。你能添加一些链接来确认/解释这句话吗“注意,在C++11中,不使用STL就集成了对基于范围的循环的支持”?@Nicoberogorry Google是你的朋友。键入“C++11基于范围的循环”实际上,我在发表评论后立即这样做,并找到了我需要的材料。无论如何,我所需要的一切都已经在你的第一个链接中解释过了,看来我很快就读到了你的答案……std::iterator在C++17中被弃用了