2009-03-03 126 views
1

很多時候,我發現自己不得不爲多維數據定義一個容器。我們舉一個例子:我有許多芯片,每個芯片有許多寄存器,每個寄存器有許多單元,每個單元有許多晶體管。C++多維數據處理

在我的C++程序的某個階段,我必須讀取這些數據,之後我必須使用它。

我不能使用該數據的任何外部存儲:文件,資料庫等

所以,我應該創建一些多維的STL容器?矢量地圖的地圖,或類似的東西......?

或者我應該爲他們每個人創建類(結構)?包含晶體管向量的單元類,然後是包含單元格向量的Register類?但是如果後來我想通過晶體管訪問我的數據,而不是通過芯片?

還有其他方法嗎?

謝謝

編輯:忘了提及:我不能使用提升。

回答

4

爲他們實現完整的類。最終你的代碼會更乾淨。

每當我忽略這個公理,它會回來困擾我。我根據std :: strings和std:pairs的std :: pairs實現了一個分層的3層字符串集合。它非常簡單快捷,當我需要用一個類替換一個圖層和另一個圖層來包含額外的屬性時,這非常容易。但最終,代碼很亂,我並不樂意記錄它。再教訓教訓,又一次,又一次......

+0

讓我想起Charniak等人的書人工智能編程的討論的。在設計一個基於類似的系統之後,他們不記得什麼屬性(cadar x)的含義(粗略地,x.first.second.first),並且不能重新設計它。 – 2009-03-03 15:30:20

5

您需要映射您的域名。

那麼,我應該創建一些多維STL容器嗎?矢量地圖的地圖,或類似的東西......?

每個矢量/圖將包含某種類型的對象。這使我們對你的下一個問題:)

或者我應該爲他們每個人創建類(結構)?

看起來這就是你至少需要的。

單元類,它包含一個晶體管的向量,然後包含一個向量的單元格等寄存器類?

看看has-ais-implemented-in-terms-of設計。

但是如果後來我想按晶體管對數據進行排序,而不是通過芯片?

什麼數據?您可以隨時根據上下文傳遞比較器。另外,問問自己,您是否真的需要將Transistor級別詳細信息公佈給Chip的人員。這將有助於開始。

1

如果你想訪問你的數據沿着不同的「維度」,你可能會對boost::multi_index_container感興趣。我自己並沒有使用它,但看起來它符合法案。

1

誠如,我選擇,以實現全類:

class Chip 
{ 
    map<RegisterLocation, Register> RegistersPerLocation; 
    public: 
    void AddRegisterPerLocation(RegisterLocation, Register); 

}; 

class Register 
{ 
    map<CellLocation, Cell> CellsPerLocation; 
    public: 
    void AddCellPerLocation(CellLocation, Cell); 
}; 

// etc..