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

C++ 在for循环中声明几个新计数器,c++,c,stl,C++,C,Stl,考虑以下代码: vector<int> v; for(vector<int>::iterator vi = n.begin(), int i = 0; vi != n.end(); ++vi, ++i){} 向量v; 对于(vector::iterator vi=n.begin(),int i=0; vi!=n.end(); ++vi,++i){} 这是不允许的原因吗?我希望能够定义两个新计数器,vi和索引I。您只能编写一个声明语句,但是 可以定义多个

考虑以下代码:

vector<int> v;
for(vector<int>::iterator vi = n.begin(), int i = 0;
    vi != n.end();
    ++vi, ++i){}
向量v; 对于(vector::iterator vi=n.begin(),int i=0; vi!=n.end(); ++vi,++i){}
这是不允许的原因吗?我希望能够定义两个新计数器,vi和索引I。

您只能编写一个声明语句,但是 可以定义多个变量,例如:

for ( int i = 0, j = 10 ; ... )
看看这个例子会有所帮助,特别是第一个例子

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)
{
}
向量v; 向量::迭代器vi=n.begin(); int i=0; 对于(;vi!=n.end();++vi,++i) { }
如果要在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.
向量v; { int i=0; 对于(vector::iterator vi=n.begin();vi!=n.end();++vi,++i){/*DO STUFF*/} }//我的范围到此结束。
<代码> > P>这是从C++入门书中解释的:

和任何其他声明一样,init语句可以定义多个对象。但是,init语句可能只是一个声明语句。因此,所有变量必须具有相同的基类型。例如,我们可以编写一个循环,在末尾复制
向量的元素,如下所示:

// 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语句中定义了索引
i
,以及循环控制
sz

这很有意义,循环的
语法是:

C++11第6.5.3节用于声明[stmt.for] 用于
语句的

for ( for-init-statement ; condition opt ; expression opt ) statement
init语句的
仅为一条语句。声明两种不同类型的变量将使它至少有两个语句

这是不允许的原因吗

因为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) {}
for(struct{vector::iterator vi;int i;}x={n.begin(),0};
x、 vi!=n.end();
++x、 vi,++x.i){}
答案是“除了语法要求之外,没有其他原因”

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

您可以创建自己的作用域来绑定它:

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

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

标准禁止这样做。鲁契安回答得很好。可以展开吗?可以声明相同类型的多个对象,但不能声明不同类型的对象。允许的语法是(ta=x,b=y,c=z;…)的
。无法解释原因。一个密切相关(重复?)的主题可以在上找到。当然,您可以在循环之前声明一个或两个计数器,这样就可以工作了。但这在保持变量在循环中的局部性方面并不令人满意。您是否对解决方法感兴趣,或者只是想知道这是不允许的原因?“可能不会在其他地方使用”*