我有一段代码是在新ISO生效之前由其他人编写的。
由于语法的for
部分,for (pa=a.begin(), i=0; pa != a.end(); ++pa)
中的i=0
LOOP执行时遇到一些麻烦。另外,我必须在for
之前使用for ( int i .....)
在其他int
循环语法前加上i
。但是,我不知道如何修复此行中的int i=0
:for (pa=a.begin ( ), i=0; pa != a.end ( ); ++pa)
。请帮帮我。
for ( int i = 0; pa != a.end(); ++pa)
*pa = ++i;
for (int i=0; i<10; i++)
std::cout << "a[" << i << "]=" << a[i] << std::endl;
// int i; // note that this will work, but I do not want this extra line.
for (pa=a.begin(), i=0; pa != a.end(); ++pa)
std::cout << "a[" << i++ << "]=" << *pa << std::endl;
答案 0 :(得分:4)
在for
循环之外的额外声明是在C ++ 98及更高版本的语言中拥有两个不相关类型的迭代变量的唯一合理方法。初始化器可以是单个表达式,也可以是单个声明,声明不能声明多个不相关类型的变量。
如果你真的想在这种情况下使用单行,那么你可以使用这个怪物:
for (int i = ((pa = a.begin()), 0); pa != a.end(); ++pa, ++i)
如果你经常做那种事情,那么确保没有一个维护你代码的人知道你住在哪里。
答案 1 :(得分:3)
不,您只能在for
内声明一种类型的变量。如果您的问题是范围,那么您可以将循环包含在一个块中(对于一些很好的示例,请查看循环宏的boost源代码):
for ( int i = 0; pa != a.end(); ++pa)
*pa = ++i;
for (int i=0; i<10; i++)
std::cout << "a[" << i << "]=" << a[i] << std::endl;
{
int i = 0;
for (pa=a.begin(); pa != a.end(); ++pa)
std::cout << "a[" << i++ << "]=" << *pa << std::endl;
}
如果你只是想让它变得更好,那么答案是不,你不能。
修改强>
最好的伎俩我看到你做了你需要的事情,并保持清楚明确的是this answer在SO上。您可以使用内联声明的未命名结构代替多个变量:
for (struct { int i; iterator it; } d = { 0, pa.begin() }; d.it != a.end(); ++d.i, ++d.it )
std::cout << "a[" << d.i << "]=" << *d.it << std::endl;
它有点多余(所以我想知道你用额外的行保存的是否重新付款)但是你明确了你的意图并保持代码可读(而且你可以用它来 pack 任何数字和任何类型的变量。)