我有一個帶有列舉類成員變數的類,其目的是作為實體化物件的描述,永遠不會有兩個相同型別的實體化物件,例如:
class A
{
enum class Type { Type1, Type2, ...} type。
}
我想把所有實體化的物件存盤在一個集合中,以便于根據型別進行訪問,所以我認為map會比較合適:
class B
{
std::map<A::Type, A> components;
然而,有些東西告訴我這不是很好的設計,因為我實際上是在重復相同的資料,即使用一個類(A)的成員變數(type)作為一個鍵,指向一個同樣擁有相同資訊的值(A類的物件)。另一個選擇是不使用列舉作為類A成員變數,而是在類B中定義該列舉,并僅將其作為一個鍵。 有什么建議嗎?
uj5u.com熱心網友回復:
讓我們考慮一下地圖的關鍵特征吧
獨特的鍵相對于鍵來說是有序的。const,值不是您的需求與最后一項對比,所以現在您可以考慮在其他方面做出什么妥協。
std::set<A,CustomComparator>/code>使用自定義比較器,你可以確保唯一的鍵可以存盤在值中,并且排序可以和map一樣。但是元素是const。你可以使用mutable,但這繞過了const-correctness,應該謹慎使用。
std::vector<A>。
這是最靈活的,但你需要手動處理你從地圖上得到的幾乎所有東西。如果你只填充一次向量,然后只訪問元素,這可能是可行的,因為那時你需要檢查唯一性,并只對元素進行一次排序。
- 一些非std容器
Jarod42建議提升侵入性的設定。可能還有其他非標準的容器符合你的需求。
- 就用
std::map<A::type,A>。
如果鍵只是一個單一的列舉值,那么將鍵存盤兩次是一個簡單的解決方案,它有一定的成本,但是當你想使用一個map容器時,你可以使用該容器。
- 首先不在 mapped_values 中存盤鍵 。
當 mapped_values 只存盤在地圖中而不在地圖之外使用時,這實際上是最簡潔的解決方案。當你仍然需要mapped_values和地圖外的key時,你可以使用std::pair<type::A,A>。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/329336.html
標籤:
