我试图创建一个接收向量并简单地反转(手动)的函数。我知道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;
}
答案 0 :(得分:1)
您的问题与rend()
的解除错误无关。您在迭代时修改向量,这会使迭代器失效。
要回答您的原始问题,reverse_iterator
并非只是“反转”结束&#34;与前向迭代器相比。 rbegin()
为end() - 1
,rend()
为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 Development和insert成员函数都会修改向量并使迭代器无效。
答案 4 :(得分:1)
作为设计问题的提示:在函数中使用always const-reference,除非你真的知道自己在做什么。所以你会避免踩到像这样的陷阱。例如:
vector<int> reverseVector(const vector<int> &vect)
现在你不会遇到这个问题,因为你无法修改vect。