考虑以下代码:
vector<int> v;
for(vector<int>::iterator vi = n.begin(), int i = 0;
vi != n.end();
++vi, ++i){}有什么理由不允许这样做吗?我希望能够定义两个新的计数器,包括vi和索引i。
发布于 2013-10-21 15:01:55
这是C++ Primer一书中的解释
与任何其他声明一样,init语句可以定义多个对象。然而,init语句可能只是一个声明语句,因此,所有变量都必须具有相同的基类型。例如,我们可以编写一个循环来复制
vector的元素,如下所示: //记住v和stop的大小,当我们到达原始的最后一个元素时:(v.size()i= 0,sz = v.size();i != sz;++i) v.push_back(vi); 在这个循环中,我们在init语句中定义了索引i和循环控件sz。
这是合理的,for循环的语法是:
C++11§6.5.3 for语句stmt.for
for语句 for (for-init-语句;条件选择;表达式选择)语句
for-init-statement仅是一条语句。声明两种不同类型的变量将使其至少有两条语句。
发布于 2013-10-21 15:01:35
如果要在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-21 15:09:54
有什么理由不允许这样做吗?
因为C++的神秘声明语法不允许您在同一声明语句中声明不相关类型的对象;而for循环的初始化器只允许一个声明语句。
我希望能够定义两个新的计数器,包括
vi和索引i。
如果您不介意污染周围的块,您可以在循环之外声明一个或两个。否则,你可以把它们放在一个结构里:
for (struct {vector<int>::iterator vi; int i;} x = {n.begin(), 0};
x.vi != n.end();
++x.vi, ++x.i) {}https://stackoverflow.com/questions/19497435
复制相似问题