2010-04-20 208 views
46
#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中的最後一個元素

+2

爲什麼不使用'n.rbegin()'? – kennytm 2010-04-20 19:55:13

+4

出於某種原因,我不想擁有reverse_iterator。 – cpx 2010-04-20 19:58:04

回答

77

是的,你可以從最後一個回去。 (假設你知道該列表不爲空)。

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

在'newlist.splice( - newlist.end(),oldlist)'可以縮短的地方;' – dmckee 2011-12-08 20:02:57

5

採取end()去一個倒退。

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

爲什麼我必須向後退一步?有沒有虛擬的末端節點或什麼? – Tarion 2018-01-04 17:09:34

+0

@Tarion:n.end()並不指向最後一個元素,而是指向列表的最後。 – ratiotile 2018-02-07 02:15:01

44

下面的任一會返回一個std::list<int>::iterator到最後一個項目在list

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_iterator到最後一個項目在list

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

'back()'返回最後一個元素的引用,而不是最後一個元素的迭代器; 'rbegin()'返回一個反向迭代器,而不是一個迭代器。 – 2010-04-20 20:00:37

+6

逆向迭代器是一個迭代器。它只是不是一個list :: iterator。 – 2010-04-20 20:24:27

+0

@丹尼斯:我的意思是:對不起,如果不明確。 – 2010-04-20 20:26:21

6

具有反向迭代器:

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

作爲一個方面說明:這還是查爾斯·貝利方法有恆定的複雜性,而std::advance(iter, n.size() - 1);具有線性複雜性與列表[因爲它有雙向迭代器]。

+0

爲什麼「 + n.rbegin()「?對我來說,看起來像倒數迭代器到倒數第二個元素。 「n.rbegin()。base()」(不帶「++」)不是最後一個元素的迭代器嗎? – zentrunix 2014-09-11 12:40:05

+0

@JoséX。 base()不僅僅是將反向迭代器轉換爲前向迭代器的簡寫形式。看看這個響應瞭解更多關於base的信息:http://stackoverflow.com/a/16609146/153861 – 2014-09-22 09:47:34

1

你可以編寫自己的函數來從給定的函數中獲得前一個(和下一個)迭代器(當我需要「後視」和「向前看」時,我用了一個std::list):

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

然後:

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

順便說一句,這也可能是在Boost庫(next and prior)可用。

+5

這也可以在C++ 0x中使用('std :: next'和'std :: prev' )。 – 2010-04-20 20:30:03

0
list<int>n; 
list<int>::reverse_iterator it; 
int j; 

for(j=1,it=n.rbegin();j<2;j++,it++) 
cout<<*it; 
+3

解釋你發佈的代碼會讓你的答案更好。 – 2012-11-21 00:13:33

5
std::list<int>::iterator iter = --n.end(); 
cout << *iter; 
相關問題