我试图使用迭代器访问向量的元素。但我得到了奇怪的输出。
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
答案 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。
相同的内容