如何在for循环中声明第二个迭代器?

How to declare a second iterator inside a for loop?

提问人:Luchian Grigore 提问时间:1/4/2012 最后编辑:CommunityLuchian Grigore 更新时间:1/5/2012 访问量:314

问:

注意:我知道我可以将声明移到循环之外。

我想在一个循环中声明几个变量:for

for ( int x = 0, int y = 0 ; ; )
{
}

,但这不起作用,因为我无法在逗号后指定类型。在这种情况下,删除第二个变量或在循环外部声明将解决问题,但是如果我想在循环内声明两个变量并且还具有不同的类型怎么办?,inty

我可以有这样的东西吗?

for ( int x = 0, float y = 0 ; ; )
{
}

?

C++ for 循环

评论

0赞 Hasturkun 1/4/2012
没有办法在for循环中定义两种类型的变量的可能重复?
0赞 Mechanical snail 8/17/2012
可能的重复项 我可以在for循环的初始化中声明不同类型的变量吗?

答:

8赞 Fred Foo 1/4/2012 #1

这是不可能的;C++语法不会承认这一点。最接近这一点的方法是在循环周围放置一个额外的范围:

{
    int x;
    float y;

    for (x=0, y=0;;) {
    }
}

评论

0赞 bames53 1/5/2012
正如其他答案中指出的,您可以通过在 for 语句中声明结构类型或使用其他聚合类型(如 std::tuple)来做到这一点。
0赞 Fred Foo 1/5/2012
@bames53:是的,但严格来说,这不会给你一个以上的变量,其范围仅限于循环。for
5赞 Fiktik 1/4/2012 #2

不可以,您只能在其中声明一种类型的变量。您可以做的是使用 或类似的构造来解决此问题:std::pairstd::touple

for(std::pair<int, float> p = std::make_pair(0, 0.0f);; )
{
    p.first++;
    p.second *= 0.5f;
}

评论

0赞 Bret Kuhns 1/4/2012
我还想提一下/。我仍然要提醒说,这似乎是对声明的奇怪使用。如果其中一个变量不是专门用于约束迭代的,则不应将其捣碎到 .pairtoupleforfor
0赞 Fiktik 1/4/2012
我同意,虽然这是一种方式,但它不是我通常使用的方式。它对循环体的可读性没有帮助,并且在浏览代码时,构造似乎非常不寻常。我会选择@larsmans提出的解决方案。
0赞 bames53 1/5/2012
还可以声明具有成员的结构类型。看看我的答案。
0赞 m0e 1/4/2012 #3

不,这是不可能的,它们都必须是同一类型。

0赞 Simon Richter 1/4/2012 #4

你不能。

我的建议是将内部代码拆分为一个单独的函数以保持其可读性:

template<typename O, typename I>
O copy(I in, I end, O out) {
    for(; in != end; ++in, ++out)
        *out = *in;
    return out;
}

IMO,这比发明一个新的范围或延长迭代器的生命周期要好得多,而且它让你思考代码是否可以泛型。

2赞 bames53 1/5/2012 #5

C++ 允许您执行此操作:

for( struct {int x; float y;} s; s.x<10; s.x++,s.y*=2.0f) {

}

MSVC 有一个 bug,因此它不允许这样做,但更符合标准的编译器允许它。