提问人:Luchian Grigore 提问时间:1/4/2012 最后编辑:CommunityLuchian Grigore 更新时间:1/5/2012 访问量:314
如何在for循环中声明第二个迭代器?
How to declare a second iterator inside a for loop?
问:
注意:我知道我可以将声明移到循环之外。
我想在一个循环中声明几个变量:for
for ( int x = 0, int y = 0 ; ; )
{
}
,但这不起作用,因为我无法在逗号后指定类型。在这种情况下,删除第二个变量或在循环外部声明将解决问题,但是如果我想在循环内声明两个变量并且还具有不同的类型怎么办?,
int
y
我可以有这样的东西吗?
for ( int x = 0, float y = 0 ; ; )
{
}
?
答:
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::pair
std::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
我还想提一下/。我仍然要提醒说,这似乎是对声明的奇怪使用。如果其中一个变量不是专门用于约束迭代的,则不应将其捣碎到 .pair
touple
for
for
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,因此它不允许这样做,但更符合标准的编译器允许它。
评论