2010-07-20 71 views
2

我只需要一個「袋子的東西」。它不需要是一個集合,一張地圖,甚至是任何特定的順序。我只需要添加和迭代它就可以了,僅此而已。我不認爲它會很大,但如果它確實如此,它不會變得非常糟糕。當你需要的時候,首選的STL系列是什麼?

我應該使用什麼容器?

+0

有幾個問題:(1)您是否需要多次存儲相同的值? (2)您是否需要保留元素上的任何順序? (3)_thing_是一種值類型嗎? (4)加法需要快嗎? (5)移除需要快嗎?我認爲(2)的答案是_no_,但我想確定。 – 2010-07-20 01:41:00

+0

@ D.Shawley,#1&2:已經解決(否和否)#3是,#4是合理的,#5不需要單獨清除,批量清理是。 – BCS 2010-07-20 14:44:21

回答

8

該標準建議使用vector作爲默認容器。但是Herb Sutter實際上是makes a case for using deque as your first choice

+1

+1 。我相信我記得Sutter更喜歡這個矢量,但是你的鏈接清除了所有這些:默認情況下標準用於矢量,默認情況下Sutter用於Deque。 – paercebal 2010-07-20 13:24:28

+0

查看Neil的博客:http://punchlet.wordpress.com/2009/12/27/letter-the-fourth/。除非你需要C兼容性,'deque'是一個適合所有人的組件。 – 2010-07-20 14:50:15

+0

+1 ...我試圖記住誰推薦'deque'作爲一個很好的默認選擇 – 2010-07-20 22:57:47

1

std::vector。不需要operator<

5

vector可能具有所有容器的最低開銷。只要你不添加或刪除中間的東西。

+0

什麼是用法配置文件?我想這導致的問題是,如果某人有工具,估計使用每個集合類型的假設配置文件的增加/迭代/刪除/等。 – BCS 2010-07-20 00:35:00

+0

Vector的唯一弱點是中間的插入和移除,所以如果你不關心除了元素在容器中的任何東西,你總是可以添加到最後,並避免病態的情況。 – 2010-07-20 00:39:07

+0

我不知道那個......'push_back()'不完全符合我所說的_fast_,因爲集合變大了。 – 2010-07-20 01:41:58

5

默認情況下,使用矢量...但是,如果可能的話,不要忘記使用類型間接!

原因是,如果你只需要迭代,那麼你應該可以使用任何一個可用的STL容器,並通過typedef間接選擇它。

例如,假設您最初會選擇一個向量(這是默認選項):

typedef std::vector<MyThing> MyThingContainer ; 

然後用容器和往常一樣:

void foo(MyThingContainer & things) 
{ 
    for(MyThingContainer::iterator it = things.begin(), 
     itEnd = things.end() ; 
     it != itEnd ; 
     ++it) 
    { 
     MyThing & thing = *it ; 
     // Do something with that thing 
    } 
} 

這樣,當你找到一個列表,或者一個deque,或者任何比vector更好的容器時,只要改變typedef並重新編譯,你就會改變容器的真實類型。

+1

+1類型間接。 – 2010-07-20 13:04:41

+0

@Fred Larson:事實是,這是我回答的唯一原因。畢竟,所有的答案已經足夠了(儘管你的回答讓我停頓了一下),所以沒有必要再添加一個,但是對於這個間接的事情......^_^... – paercebal 2010-07-20 13:22:57

0

std :: vector是一個很好的默認選擇。這是一個簡單的數據結構,實現爲一個動態數組。這些元素彼此緊挨着,這是很好的參考地址(有利於緩存)

相關問題