迭代器不能正常访问的问题
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相同。
我正在尝试使用迭代器访问向量的元素。但是我得到了奇怪的输出。
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相同。