4

考虑以下代码:

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

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

4

6 回答 6

4

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

与任何其他声明一样,init-statement 可以定义多个对象。然而,init-statement 可能只是一个单一的声明语句。因此,所有变量必须具有相同的基本类型。作为一个例子,我们可以编写一个循环来复制 a 的元素,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 语句中定义了索引i和循环控制。sz

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

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

for声明_

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

for-init-statement只是一种说法。声明两种不同类型的变量会使它至少有两个声明。

于 2013-10-21T15:01:55.030 回答
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.
于 2013-10-21T15:01:35.197 回答
2

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

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

我希望能够定义 2 个新计数器,vi以及 index i

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

for (struct {vector<int>::iterator vi; int i;} x = {n.begin(), 0}; 
     x.vi != n.end();
     ++x.vi, ++x.i) {}
于 2013-10-21T15:09:54.677 回答
2

答案是“除了语法需要之外,没有任何理由”。

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

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

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

   for ( ; it != end; ++it, ++i)
   {}
}
于 2013-10-21T15:30:11.680 回答
1

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

for ( int i = 0, j = 10 ; ... )
于 2013-10-21T14:41:33.343 回答
0

查看逗号运算符维基百科页面会有所帮助,特别是第一个示例。

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)
{
}
于 2013-10-21T14:50:00.190 回答