迭代器不能正常访问的问题

iterators can't access problems properly

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

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 

end 迭代器不是可以解除引用的迭代器。他们将最后一个元素 过去 指向容器。这是有充分理由的。但总而言之,end 迭代器实际上并不指向任何元素。如果你想要最后一个元素,你需要递减结束迭代器。

对于您的第一个示例,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

here

中所述

Return 结束的迭代器,Returns 是引用向量容器中尾后元素的迭代器。

尾后元素是向量中最后一个元素之后的理论元素。它不指向任何元素,因此不应取消引用。

由于标准库函数使用的范围不包括其闭迭代器指向的元素,该函数常与vector::begin结合使用,指定一个范围包括容器中的所有元素.

如果容器为空,此功能returns与vector::begin相同。