迭代器无法正确访问问题

时间:2015-02-02 09:21:13

标签: c++ vector iterator

我试图使用迭代器访问向量的元素。但我得到了奇怪的输出。

std::vector<int> ivec{ 7, 6 , 8, 9} ; 

std::vector<int>::iterator beg = ivec.begin(); 
std::vector<int>::iterator last = ivec.end(); 

std::cout << *beg << *last << std::endl; 

但是,在上述情况下,程序会显示错误:debug assertion failed. Vector iterator not dereferencable.,此错误尤其适用于*last。如果我打印*beg似乎错了。但不能取消引用最后一个。

我用迭代器得到的其他问题是在增量期间。

std::vector<int>::iterator beg = ivec.begin(); 

cout << *(beg++) ;  // in this case it prints me value of 7
cout << *(++beg) ;  // in this case it print me the right value of second place i.e. is 6
cout << *(beg+=1) ; // in this case we also print the second value i.e. 6 

3 个答案:

答案 0 :(得分:3)

end迭代器不是可以取消引用的迭代器。他们将过去指向容器中的最后一个元素。这有必要成为现实的一个很好的理由;但是长而短,end迭代器实际上并不指向任何元素。如果你想要最后一个元素,你需要减少结束迭代器。

答案 1 :(得分:0)

对于您的第一个示例,std::vector<T>::end指向实际最后一个元素之后的理论元素,因此取消引用它没有意义。它主要用于检查何时在循环中超过向量的末尾。

对于您的第二个示例,结果如您所料:

cout << *(beg++) ; //increments beg after dereferencing
cout << *(++beg) ;  //increments beg before dereferencing
cout << *(beg+=1) ; //dereferences the result of adding one to beg

答案 2 :(得分:0)

here中所述,

将迭代器返回到end,返回一个迭代器,引用向量容器中的past-the-end元素。

过去结束元素是跟随向量中最后一个元素的理论元素。它没有指向任何元素,因此不应被解除引用。

因为标准库的函数使用的范围不包括其闭合迭代器指向的元素,所以此函数通常与vector :: begin结合使用以指定包含容器中所有元素的范围。

如果容器为空,则此函数返回与vector :: begin。

相同的内容