2009-03-03 79 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..