2014-02-19 43 views
0

我不確定,如果這是發佈此問題的正確位置。請讓我知道,如果不是。比圖更好的東西<string,map <string,vector>

我有一些'實體'。每個實體都有許多屬性(所有實體具有相同數量的屬性),這些屬性本身存儲爲數組(長度相同)。我希望以這種方式存儲'實體',以便我可以通過名稱獲取每個實體。

爲此,我應該使用map<string, entity>來按名稱存儲每個實體。

現在的麻煩是,在這個需求(存儲多個實體)出現之前,我曾經將一個實體存儲爲map<string, vector>,其中每個向量是一個屬性,字符串表示屬性名稱。

考慮到這一點map<string, entity>現在變成: map<string, map<string, vector>

什麼是以前一個簡單而優雅的解決方案已經成爲難以閱讀和難以使用。

  • 封裝map<string, vector>作爲一個實體類似乎走得太遠了漂亮的代碼的緣故(因爲我沒有任何程序放在類)。

  • 我會更好地使用實體作爲一個結構來「美化」代碼嗎?

  • 還是有一個更簡單或更優雅的解決方案,我錯過了?

  • 或者這個實現是我所希望的最好的嗎?

注:我正在處理一個相當大的數據集。地圖上將會有1500-2000個實體。每個實體將具有4-10個屬性。每個屬性將有近10000個值。性能是一個約束。

+3

使用typedef? –

+0

multimap代替映射如何 ST3

+1

@ ST3 multimap是一個允許多個值針對單個鍵存儲的映射。對?在這種情況下multimap會有幫助嗎? –

回答

2

無論如何,我將建議一個Entity類或結構。原因在於您的實現可能會隨時間發生變化(例如,從map<string, vector<T>>multimap<string, T>unordered_map),並且給實體一個實際的API允許您封裝這些更改並對實體由其他代碼處理的方式施加限制。它還會使代碼和可能的編譯器錯誤消息更容易閱讀。

如果將類/結構實現完全放置在標題中並且不使用virtual方法,則性能不應該受到影響。用Stroustrup的話來說,C++是一種「輕量級抽象語言」,被解析爲「輕量級抽象語言」,這是一個輕量級抽象看起來合適的地方。

+1

確實,這似乎是一種乾淨的方式,除非您絕對確定*實體可用或使用的屬性不會在將來需要更改或擴展,否則您的設計應該保留屬性選擇器(字符串或枚舉),以便將來可以添加新的(並刪除其他)。 –

相關問題