为什么以下代码片段会给出不同的输出? (见下面的输出)
片段 1:
vector<int> v;
v.push_back(1);
v.push_back(2);
vector<int>::const_iterator iterv1=v.begin();
vector<int>::const_iterator iterv2=v.begin();
for(;iterv1!=v.end();++iterv1){
for(;iterv2!=v.end();++iterv2){
cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
}
}
输出:
*iterv1 = 1 *iterv2 = 1
*iterv1 = 1 *iterv2 = 2
代码片段 2:
vector<int> v;
v.push_back(1);
v.push_back(2);
for(int i=0;i<2;++i){
for(int j=0;j<2;++j){
cout << "v[i] = " << v[i] << " v[j] = " << v[j] << endl;
}
}
输出:
v[i] = 1 v[j] = 1
v[i] = 1 v[j] = 2
v[i] = 2 v[j] = 1
v[i] = 2 v[j] = 2
我本来期望相同的(数字输出。显然我对迭代器有一些不了解的地方。有人可以帮忙吗?
最佳答案
好吧,您不会在内循环中将 iterv2
重置到开头。您应该将初始化代码放在它所属的位置:在 for-initialization 中。
要么只移动 for-initialization 中的赋值:
vector<int>::const_iterator iterv1;
vector<int>::const_iterator iterv2;
for(iterv1=v.begin();iterv1!=v.end();++iterv1){
for(iterv2=v.begin();iterv2!=v.end();++iterv2){
cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
}
}
如果以后不需要,甚至可以将变量放在循环中:
for(vector<int>::const_iterator iterv1=v.begin();iterv1!=v.end();++iterv1){
for(vector<int>::const_iterator iterv2=v.begin();iterv2!=v.end();++iterv2){
cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
}
}
顺便说一下,如果你使用 C++11,你可以使用以下两个新的语言特性: auto
关键字可以用来省略类型说明(不是与动态类型混淆,因为这仍然是静态类型,这意味着编译器计算出类型并以与显式编写类型相同的方式编译它):
for(auto iterv1=v.begin();iterv1!=v.end();++iterv1){
for(auto iterv2=v.begin();iterv2!=v.end();++iterv2){
cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
}
}
基于范围的 for 循环的新语法(类似于 Java 的)将使编写和阅读(更重要的是)变得容易得多:
for(auto iterv1 : v){
for(auto iterv2 : v){
cout << "*iterv1 = " << *iterv1 << " *iterv2 = " << *iterv2 << endl;
}
}
附言如果您将初始化移到基于索引的版本中的循环之外,也会发生同样的错误:
// WRONG - SAME ERROR
int i = 0;
int j = 0;
for(;i<2;++i){
for(;j<2;++j){
cout << "v[i] = " << v[i] << " v[j] = " << v[j] << endl;
}
}
PP.S.在运算符周围添加空格,使您的代码更具可读性。大多数代码风格指南都要求这样做。
关于c++ - 嵌套循环中迭代器的行为与 C++ 中的随机访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15013654/