2

我正在尝试使用迭代器来遍历vector<char*>c++ 中的 a。我已经构建了一个虚拟程序,它应该从末尾开始,然后在大于 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;
}

任何人都可以识别问题吗?

编辑

我忘了我做了一个小改动。我之前的代码没有填充tmp到初始化 for 循环中。已修复

4

2 回答 2

7

问题是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;   
}
于 2012-08-13T14:54:30.783 回答
0

由于目标实际上是不使用过去的位置,所以我重新定义了这个问题:它需要两个迭代器,一个指向所需范围内的第一个元素,一个指向最后一个。然后机制变得简单:

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
于 2012-08-13T15:56:26.637 回答