所以,我已經有了一個名單:如何獲得列表中的某個元素,給定位置?
list<Object> myList;
myList.push_back(Object myObject);
我不知道,但我相信,這將是在數組中的「零」的元素。 有沒有我可以使用的函數返回「myObject」?
Object copy = myList.find_element(0);
?
所以,我已經有了一個名單:如何獲得列表中的某個元素,給定位置?
list<Object> myList;
myList.push_back(Object myObject);
我不知道,但我相信,這將是在數組中的「零」的元素。 有沒有我可以使用的函數返回「myObject」?
Object copy = myList.find_element(0);
?
如果您經常需要訪問序列的第N個元素,則作爲雙向鏈表執行的std::list
可能不是正確的選擇。 std::vector
或std::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::list
,std::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
。
由於缺乏隨機訪問而導致您在搜索鏈表時付出了性能損失,如果您需要在矢量或雙端隊列中插入或移除數據,則會付出更大的性能損失。這個問題實際上並沒有包含足夠的信息來決定他們是否將理想的容器用於他們的目的。 – tloach 2015-09-18 14:21:50
std::list
沒有提供任何函數來獲取給定索引的元素。您可以嘗試通過編寫一些我不推薦的代碼來獲得它,因爲如果您經常需要這樣做,效率會很低。
你需要的是:std::vector
。使用它作爲:
std::vector<Object> objects;
objects.push_back(myObject);
Object obj = objects[0]; //get element given an index
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
}
沒有陣列 - 這是一個列表。如果你想用整數索引,爲什麼不用'vector'來代替? – 2011-04-20 16:52:32
如果您始終想要元素0,請使用'front()'。 – 2011-04-20 16:53:06
我沒有測試過這個,但我會假設myList.front()+ num會在這裏工作 – 2013-12-15 12:03:35