【问题标题】:Loop with iterators syntax VS Loop with generators syntax带有迭代器语法的循环 VS 带有生成器语法的循环
【发布时间】:2017-09-20 01:55:25
【问题描述】:

我注意到生成器函数返回一个具有 .begin() 和 .end() 方法的对象。所以我尝试使用迭代器的经典语法:

for (auto it = x.begin(), end = x.end(); it != end; ++it) { /**/ }

但我注意到它不起作用......这是我的代码:

#include <experimental\generator>
using namespace std;

experimental::generator<int> test() {
    co_yield 0;
}

int main() {
    /*/
    // THIS LOOP MAKES PROGRAM CRASH
    for (auto it = test().begin(), end = test().end(); it != end; ++it)
        int a = *it;
    /*/
    // THIS LOOP WORKS
    for (auto i : test())
        int a = i;
    /**/

    return 0;
}

关于生成器循环和迭代器语法有什么我不知道的吗?有没有办法在生成器中使用迭代器语法?

感谢您的回答!

【问题讨论】:

  • 您多次致电test,因此您每次都会得到一个新的生成器。 (for (auto obj = test(), auto it = obj.begin(), end = obj.end(); it != end; ++it))
  • 我不了解生成器,每次调用test 是否返回相同的生成器或不同的生成器对象?如果它返回不同的对象(我想我会这样做),那么它们的 beginend 迭代器将不相关。

标签: c++ loops iterator generator


【解决方案1】:

正如 Caramiriel 和 Some Programer Dude 所注意到的,我实例化了两次生成器。以下循环有效:

auto gen = test();
for (auto it = gen.begin(), end = gen.end(); it != end; ++it)
    int a = *it;

【讨论】:

  • 将其命名为 iterator 听起来是个坏主意。
  • 是的,如果您在命名空间中(即 std::iterator),但这不是问题,它只是用于示例 ^^
  • 不,这是个问题。就像调用 double 类型的变量名称 integer (当它有值 0.5 时)
  • 哦!我误会了你^^'是的,既然你提到它,它显然是错误的。
猜你喜欢
  • 2020-01-15
  • 2012-10-24
  • 2021-07-05
  • 2011-11-13
  • 2014-10-21
  • 2015-05-04
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
相关资源
最近更新 更多