嵌套循环中迭代器的行为与C++中的随机访问相比
behavior of iterators in nested loops versus random access in C++
为什么以下代码片段给出不同的输出?(见下文输出)
代码段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;
}
}
Ouptut:
*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
重置为开头。您应该将初始化代码放在它所属的位置:用于初始化。
要么只在中移动分配进行初始化:
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;
}
}
PPS.在运算符周围添加空格,使代码的可读性略高。大多数代码样式准则都要求这样做。
相关文章:
- 为什么 vector 的随机访问迭代器给出与指针不同的内存地址?
- 读取大文件(>2GB)(文本文件包含以太网数据)并通过不同参数随机访问数据的最佳方法是什么?
- 如何为我的容器实现随机访问迭代器?
- 对于C++随机访问迭代器(矢量迭代器),迭代器之间的差异是如何计算的?
- 对于随机访问迭代器(矢量迭代器),迭代器C++样式指针吗?
- Deque 中元素的随机访问如何提供恒定的时间复杂度?
- C++ STL 数据结构常时按索引推送/弹出/随机访问,并具有指向元素的可靠指针
- SFINAE - 检测类型 T 是指针、数组还是带有随机访问运算符的容器,以及给定的值类型
- 随机访问迭代器:我错过了什么?
- 随机访问元组向量中的元组值
- 有没有办法在C++中制作无锁"counter"随机访问迭代器?
- 当 95% 情况下的值为 0 或 1 时,对非常大的数组进行随机访问的任何优化
- 如何确保函数模板的参数是随机访问迭代器
- C++基于现有随机访问迭代器的反向迭代器
- C++ 写入随机访问文件
- 如何实现随机访问迭代器的"less than operator"?
- 随机访问迭代器和Deque
- 如何创建一个随机访问式的Rreference以访问.RC文件中定义的资源
- 在链表上实现随机访问迭代器
- 随机访问文件格式,用于分层组织的二进制文件和文本文件