在for循环中声明几个新计数器

时间:2013-10-21 14:37:24

标签: c++ c stl

请考虑以下代码:

vector<int> v;
for(vector<int>::iterator vi = n.begin(), int i = 0;
    vi != n.end();
    ++vi, ++i){}

有没有理由不允许这样做?我希望能够定义2个新计数器,包括vi和索引i。

6 个答案:

答案 0 :(得分:4)

这是 C ++ Primer 一书中的解释:

  

与任何其他声明一样,init-statement可以定义多个对象。但是, init-statement可能只是一个声明语句。因此,所有变量必须具有相同的基本类型。作为一个例子,我们可以编写一个循环来复制vector的元素,如下所示:

// remember the size of v and stop when we get to the original last element

for (decltype(v.size()) i = 0, sz = v.size(); i != sz; ++i)

    v.push_back(v[i]);
     

在这个循环中,我们在init-statement中定义了索引i和循环控件sz

这是有道理的,for循环的语法是:

  

C ++11§6.5.3for语句[stmt.for]

     

for声明

for ( for-init-statement ; condition opt ; expression opt ) statement

for-init-statement只是一个陈述。声明两种不同类型的变量至少会使它成为两种语句。

答案 1 :(得分:2)

如果要在for循环中使用两个不同类型的变量,则必须在for循环的范围之外声明一个变量。您可以通过将循环包含在一组大括号中来强制执行第二个范围:

vector<int> v;
{
int i = 0;
for(vector<int>::iterator vi = n.begin(); vi != n.end(); ++vi, ++i) { /* DO STUFF */ }
} //i's scope ends here.

答案 2 :(得分:2)

  

有没有理由不允许这样做?

因为C ++的奥术声明语法不允许您在同一个声明语句中声明不相关类型的对象;并且for循环的初始化只允许单个声明语句。

  

我希望能够定义2个新计数器,vi和索引i

如果您不介意污染周围的区块,您可以在循环外声明一个或两个。否则,你可以把它们放在一个结构中:

for (struct {vector<int>::iterator vi; int i;} x = {n.begin(), 0}; 
     x.vi != n.end();
     ++x.vi, ++x.i) {}

答案 3 :(得分:2)

答案是“除语法要求之外没有其他任何理由”。

但是,我可以想象,如果允许的话,代码可能变得非常复杂,所以这是一个很好的理由不在此语言中添加对此的支持。

您可以创建自己的范围来绑定它:

std::vector<int> v;
{
   std::vector<int>::iterator it = n.begin(), end = n.end();
   int i = 0;

   for ( ; it != end; ++it, ++i)
   {}
}

答案 4 :(得分:1)

你只能写一个声明声明,但它 可以定义多个变量,例如:

for ( int i = 0, j = 10 ; ... )

答案 5 :(得分:0)

查看comma operator wikipedia page会有所帮助,特别是第一个例子。

int a=1, b=2, c=3, i=0; // comma acts as separator in this line, not as an operator 

另外,为什么不这样做?

vector<int> v;
vector<int>::iterator vi = n.begin();
int i = 0;
for(; vi != n.end(); ++vi, ++i)
{
}