2011-04-20 63 views
63

所以,我已經有了一個名單:如何獲得列表中的某個元素,給定位置?

list<Object> myList; 
myList.push_back(Object myObject); 

我不知道,但我相信,這將是在數組中的「零」的元素。 有沒有我可以使用的函數返回「myObject」?

Object copy = myList.find_element(0); 

+6

沒有陣列 - 這是一個列表。如果你想用整數索引,爲什麼不用'vector'來代替? – 2011-04-20 16:52:32

+2

如果您始終想要元素0,請使用'front()'。 – 2011-04-20 16:53:06

+0

我沒有測試過這個,但我會假設myList.front()+ num會在這裏工作 – 2013-12-15 12:03:35

回答

91

如果您經常需要訪問序列的第N個元素,則作爲雙向鏈表執行的std::list可能不是正確的選擇。 std::vectorstd::deque可能會更好。

這就是說,你可以得到一個迭代器使用std::advance的第N個元素:

std::list<Object> l; 
// add elements to list 'l'... 

unsigned N = /* index of the element you want to retrieve */; 
if (l.size() > N) 
{ 
    std::list<Object>::iterator it = l.begin(); 
    std::advance(it, N); 
    // 'it' points to the element at index 'N' 
} 

對於一個容器,不提供隨機訪問,像std::liststd::advance電話operator++於迭代N倍。另外,如果你的標準庫實現提供了它,你可以調用std::next

if (l.size() > N) 
{ 
    std::list<Object>::iterator it = std::next(l.begin(), N); 
} 

std::next有效地包裝了一個調用std::advance,使其更容易推進的迭代器N倍更少的代碼和更少的可變變量。在C++ 11中添加了std::next

+7

由於缺乏隨機訪問而導致您在搜索鏈表時付出了性能損失,如果您需要在矢量或雙端隊列中插入或移除數據,則會付出更大的性能損失。這個問題實際上並沒有包含足夠的信息來決定他們是否將理想的容器用於他們的目的。 – tloach 2015-09-18 14:21:50

23

std::list沒有提供任何函數來獲取給定索引的元素。您可以嘗試通過編寫一些我不推薦的代碼來獲得它,因爲如果您經常需要這樣做,效率會很低。

你需要的是:std::vector。使用它作爲:

std::vector<Object> objects; 
objects.push_back(myObject); 

Object obj = objects[0]; //get element given an index 
4
std::list<Object> l; 
std::list<Object>::iterator ptr; 
int i; 

for(i = 0 , ptr = l.begin() ; i < N && ptr != l.end() ; i++ , ptr++); 

if(ptr == l.end()) { 
    // list too short 
} else { 
    // 'ptr' points to N-th element of list 
} 
相關問題