迭代器在std :: list中最后一个元素

#include <list> using std::list; int main() { list <int> n; n.push_back(1); n.push_back(2); n.push_back(3); list <int>::iterator iter = n.begin(); std::advance(iter, n.size() - 1); //iter is set to last element } 

还有什么其他的方法可以让列表中的最后一个元素?

是的,你可以从最后一个回去。 (假设你知道列表不是空的。)

 std::list<int>::iterator i = n.end(); --i; 

下面的任何一个将返回一个std::list<int>::iteratorlist的最后一个项目:

 std::list<int>::iterator iter = n.end(); --iter; 
 std::list<int>::iterator iter = n.end(); std::advance(iter, -1); 
 // C++11 std::list<int>::iterator iter = std::next(n.end(), -1); 
 // C++11 std::list<int>::iterator iter = std::prev(n.end()); 

以下将返回一个std::list<int>::reverse_iteratorlist的最后一个项目:

 std::list<int>::reverse_iterator iter = std::list::rbegin(); 

使用反向迭代器:

 iter = (++n.rbegin()).base() 

作为一个方面说明:这个或Charles Bailey方法具有不变的复杂性,而std::advance(iter, n.size() - 1); 与列表具有线性复杂性[因为它具有双向迭代器]。

end()并向后走。

 list <int>::iterator iter = n.end(); cout << *(--iter); 
 std::list<int>::iterator iter = --n.end(); cout << *iter; 

你可以编写你自己的函数来获得给定的迭代器(当我需要使用std::list “look-behind”和“look-ahead”时,我已经使用了这个函数):

 template <class Iter> Iter previous(Iter it) { return --it; } 

接着:

 std::list<X>::iterator last = previous(li.end()); 

顺便说一句,这也可能在boost库( 下一个和之前 )中可用。

 list<int>n; list<int>::reverse_iterator it; int j; for(j=1,it=n.rbegin();j<2;j++,it++) cout<<*it;