2013-02-23 97 views
1

我將有大約1000個需要按字母順序排序的字符串。字符串排序 - std :: set或std :: vector?

的std ::設置,從我讀過,進行排序。 std :: vector不是。 std :: set似乎是一個更簡單的解決方案,但如果我要使用std :: vector,我只需要使用is std :: sort來按字母順序排列字符串。

我的應用程序可能會或可能不會表現至關重要,因此表現並不一定這裏的問題(還),但因爲我需要通過容器迭代寫入字符串的文件,我讀過迭代通過std :: set比通過std :: vector迭代要慢一點。

我知道這可能並不重要,但我想聽聽大家會一起去在這種情況下哪一個。

哪些STL容器最適合我的需要?謝謝。

+0

您需要多久進行一次排序? – 2013-02-23 00:22:04

+0

我只需要在將所有字符串添加到容器時進行一次排序。 – Alex 2013-02-23 00:32:48

+0

[可以在哪種情況下使用特定的STL容器?](http://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container) – 2013-02-23 00:33:11

回答

2

的std ::用一次性電話矢量到std ::排序好像做你所追求的,計算來講最簡單的方法。 std :: set提供了按鍵的動態查找,在這裏你並不真正需要,如果你必須處理重複的事情,事情會變得更加複雜。

確保您使用儲備向量預分配內存,因爲你知道在這種情況下提前時間的長短。這可以防止在添加到矢量中時內存重新分配(非常昂貴)。另外,如果使用[]表示法而不是push_back(),則可以節省一些時間來避免對push_back()的邊界檢查,但這實際上是學術性的和非實體性的,甚至在編譯器優化時可能甚至不是這樣。 :-)

+0

非常好的一點。另外值得一提的是,像GNU'libstdC++'這樣的庫實現通常提供可切換的「調試模式」,包括邊界檢查的容器'operator []',讓我們放棄'.at()',但保留更簡單,釋放透明,類似assert的能力來檢查調試中的界限。這是(或者將來,一旦我重構)對我來說很好:通常我知道邊界是固定的,但只是想確保我沒有做出愚蠢的事情。它會在(\(\ w \ \)/ [\ 1]/g'或更糟的時候避免一個可怕的's \ \。 – 2016-02-14 04:50:59