2011-09-12 66 views
1

我處於這種情況,我無法使用vector,因爲我使用了&element[x],然後添加了更多項目,以使指針失效。問題是std::list似乎沒有超載operator [],也沒有提供at()方法。因此,我看到我可以模擬at()的唯一方法是使用迭代器。有沒有更好的方法來做到這一點?[]運營商爲std ::列表?

+2

會std :: deque足夠嗎? – PeskyGnat

+0

您可以使用矢量和'my_iterator = my_vector.insert(my_iterator,VALUE);';向量在一般情況下提供良好的性能,即使元素要被移位。 – Benoit

回答

9

你應該重新考慮你的設計。

試圖仿效operator[]atstd::list會導致性能的災難:這些操作將需要O(N),而不是O(1)時間爲std::list::iterator是雙向迭代器,而不是隨機訪問迭代器。因此,如果您現在遍歷容器併爲每個元素調用[]at,則會導致O(N * N)而不是O(N)。

這就是爲什麼這些操作不是由std::list提供。

+0

爲了更加準確,'std :: list'迭代器是**雙向的**不轉發。 – Blastfurnace

+0

@Blastfurnace絕對,修復它 –

4
#include <iterator> 

std::list<int> l; 
std::list<int>::iterator it = l.begin(); 
std::advance(it, 37); 

對於非隨機訪問迭代(像那些list),這將需要當然線性時間。

0

沒有std :: list是一個鏈表。不可能直接訪問一個元素。它從頭開始重複元素的唯一可能性。