2011-04-08 46 views
2

我想過存儲一些對象......現在我不知道該選什麼。什麼容器可供選擇

所以,現在我有這樣的代碼:

​​

但是,正如我之前在這裏說,這是緩慢的,由於在每個搜索std::string分配,所以關鍵應該是整數。

爲什麼我選擇std::string作爲關鍵?因爲它很容易通過其名稱訪問對象,例如:

mObjects["SomeObj"]; 

所以我的第一個想法是:

std::map<int, Object*> mObjects; 

,key是對象名稱的CRC:

mObjects[CRC32("SomeObject")]; 

但它有點不穩定。而且我知道這裏有特殊的哈希映射。 最後,我必須使用一些Compare函數在地圖中對我的對象進行排序。

關於容器的任何想法我可以使用?

如此反覆,要點:

  • Accesing通過字符串對象,但keyshould是整數,不串
  • 一些功能

附註:排序在地圖對象提高使用率是允許的。

+3

您是否在表示速度很慢之前先使用字符串鍵測量性能? – jfs 2011-04-08 17:52:26

+0

由於運行時限制,字符串是必需的,或者是編譯時已知的所有值,並且可以用常量替換,例如:'const int SOME_OBJECT = 1; ...mObject [SOME_OBJECT] ...' – Thanatos 2011-04-08 17:55:48

+0

@jfs是的,我測試過了。 – Ockonal 2011-04-08 17:56:15

回答

0

我不能肯定地說,但你是否總是通過文字字符串訪問地圖中的項目?如果是這樣,那麼你應該使用帶符號名稱的連續枚舉值和適當大小的vector

假設你不會知道名稱,直到運行時,地圖上的1000個項目似乎真的很小,以便搜索可能是一個瓶頸。你是否確定查找是性能問題?你有沒有分析確定是這樣?一般來說,使用最直觀的容器會產生更好的代碼(因爲你可以更容易掌握算法)代碼。

您對構建字符串的評論意味着您是否將C字符串反覆傳遞給find函數?儘量避免在應用程序中一直使用std::string

如果您堅持使用兩部分的方法:我建議您將所有物品存儲在vector中。然後你有一個unordered_map從字符串到索引和另一個vector,它具有所有索引到主容器中。然後你排序這第二個索引容器來獲得你需要的順序。最後,當你從主容器中刪除項目時,你需要清理其他兩個引用容器。

+0

地圖怎麼樣?我打電話搜索每約〜11毫秒約250個對象。這是小數目?而且它們都是每11ms重複一次。我認爲,boost :: multiindex是我需要的。 – Ockonal 2011-04-08 18:33:06

+1

你可以發佈你用來搜索/迭代地圖的代碼,因爲(如果我正確理解數字)時間非常大。您是否構建發佈版本的代碼,有時調試版本非常慢。 – Zuljin 2011-04-08 18:55:15

+0

@Ockonal你不是在你的地圖上使用'std :: find'嗎? – 2011-04-08 19:09:40