我正在尝试使用迭代器在 c++ 中遍历vector<char*>
。 我构建了一个虚拟程序,它应该从末尾开始,在数字>0 上向后退(朝向开头或rend()
),在数字 <0 上向前(朝向结尾或rbegin()
),然后在 0 上退出。 如果迭代器已到达任一端,并且用户尝试进一步执行,则它应在该端重复该元素,而不是移动迭代器。 我的问题是,如果用户试图在最后运行,我只是得到一个段错误,而不是这样做。 这是我的代码:
#include <iostream>
#include <vector>
#include <stdio.h>
using namespace std;
int main(){
vector<char*> vect;
char* tmp;
for (int i=1; i<=5; i++){
tmp = new char[7];
sprintf(tmp, "hello%d", i);
vect.push_back(tmp);
}
vector<char*>::const_reverse_iterator it = vect.rbegin();
int a;
cin >> a;
while (a!=0){
if (a>0){
if (it < vect.rend()){
cout << *(++it) << endl;
} else{
cout << *it << endl;
}
} else{
if (it > vect.rbegin()){
cout << *(--it) << endl;
} else{
cout << *it << endl;
}
}
cin >> a;
}
return 0;
}
任何人都可以确定问题所在吗?
编辑
我忘了我做了一个小改动。 我以前的代码没有在初始化 for 循环中填充tmp
。 已修复
问题是rend
迭代器将一个项目指向序列的(反向)末尾。取消引用它会导致段错误:
if (it < vect.rend()){
cout << *(++it) << endl;
} else{
cout << *it << endl; // <---- segfault
}
最小的修复可能是
if (it+1 < vect.rend())
{
cout << *(++it) << endl;
} else{
cout << *it << endl;
}
由于目标实际上是不使用过去结束的位置,因此我将重新转换问题:它需要两个迭代器,一个指向所需范围内的第一个元素,另一个指向最后一个元素。然后机制变得简单:
if (it != end)
++it;
cout << *it << endl;
同样,反其道而行之:
if (it != begin)
--it;
cout << *it << endl;
其中开始和结束定义如下:
typedef vector<char*>::reverse_iterator iter;
iter begin = vect.rbegin();
iter end = --vect.rend(); // assumes that vect is not empty