矢量迭代器不可解除引用(尝试手动反向向量)

时间:2017-11-04 14:47:57

标签: c++ function iterator stdvector dereference

我试图创建一个接收向量并简单地反转(手动)的函数。我知道reverse()的存在,但我遇到了#34; Vector迭代器而不是dereferencable"问题和教育目的,我想知道这意味着什么。我尝试研究这个问题,并且有人(在这个论坛上)说vect.end()在定义上不是dereferencable,但从我的理解,使用reverse_iterator只是扭转了目的,所以遵循逻辑; vect.rend不应该是dereferecable。

vector<int> reverseVector(vector<int>);

int main()
{
    vector<int> vec;

    for (int i = 0; i < 11; i++)
    {
        vec.push_back(i);
    }

    vec = reverseVector(vec);

    for (vector<int>::iterator it = vec.begin(); it != vec.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;

    return 0;
}

vector<int> reverseVector(vector<int> vect) 
{
    vector<int>::reverse_iterator ritr;
    for (ritr = vect.rbegin(); ritr != vect.rend(); ritr++)
    {
        vect.insert(vect.begin(), *ritr);
        vect.pop_back();
    }
    return vect;
}

5 个答案:

答案 0 :(得分:1)

您的问题与rend()的解除错误无关。您在迭代时修改向量,这会使迭代器失效。

要回答您的原始问题,reverse_iterator并非只是“反转”结束&#34;与前向迭代器相比。 rbegin()end() - 1rend()begin() - 1

答案 1 :(得分:1)

如果向向量添加元素,ritr可能会失效,从而导致错误

  

矢量迭代器不可解除引用。

因此,最好使用索引作为循环变量,或者更好地使用副本(临时)向量进行反向任务。

答案 2 :(得分:1)

您正在从向量中删除元素(从后面弹出),使反向迭代器无效

你可以迭代一半的向量并交换元素,点击这个:

void swap(int& a, int& b) {
    int tmp = a;
    a = b;
    b = tmp;
}

vector<int> reverseVector(vector<int> vect) {
    const size_t origin_size = vect.size();
    for(size_t i = 0; i < origin_size/2; ++i)
        swap(vect[i], vect[origin_size - 1 - i]);
    return vect;
}

答案 3 :(得分:1)

Setting up Sublime Text 3 for Rails Developmentinsert成员函数都会修改向量并使迭代器无效。

答案 4 :(得分:1)

作为设计问题的提示:在函数中使用always const-reference,除非你真的知道自己在做什么。所以你会避免踩到像这样的陷阱。例如:

vector<int> reverseVector(const vector<int> &vect)

现在你不会遇到这个问题,因为你无法修改vect。