很多时候,我发现自己必须为多维数据定义一个容器。
我们举一个例子:我有很多芯片,每个芯片有很多寄存器,每个寄存器有很多单元,每个单元有很多晶体管。
在我的C ++程序的某个阶段,我必须阅读这些数据,然后我必须使用它。
我无法对此数据使用任何外部存储:文件,数据库等
那么,我应该创建一些多维STL容器吗?矢量地图或类似的地图......?
或者我应该为每个人创建类(结构)?包含Transistors矢量的Cell类,然后是包含Cells矢量的Register类等?但是如果以后我想通过晶体管访问我的数据,而不是芯片呢?
还有其他方式吗?
谢谢
编辑:忘记提及:我不能使用提升。答案 0 :(得分:5)
您需要映射您的域名。
那么,我应该创建一些多维STL容器吗?矢量地图或类似的地图......?
每个矢量/地图都包含某种类型的对象。这将我们带到你的下一个问题:)
或者我应该为每个人创建类(结构)?
看起来这至少是你所需要的。
包含Transistors矢量的Cell类,然后是包含Cells矢量等的Register类?
同时查看has-a
和is-implemented-in-terms-of
个设计。
但是如果以后我想通过晶体管排序我的数据,而不是芯片呢?
什么数据?您可以随时根据上下文传递比较器。另外,问问自己是否确实需要将Transistor
级详细信息公开给使用Chip
的人。这将有助于开始。
答案 1 :(得分:4)
为他们实施完整的课程。您的代码最终会更清晰。
每当我忽略这个公理时,它就会回来困扰我。我根据std :: pairs std :: strings和std:pairs实现了一个分层的3层字符串集合。它快速而简单,当我不得不用一个类替换一个层然后另一个层来包含额外的属性时,这非常容易。但最后,代码是一团糟,我不高兴记录它。课程再次学习,一遍又一遍......
答案 2 :(得分:1)
如果您想要沿不同的“维度”访问您的数据,您可能会对boost::multi_index_container
感兴趣。我自己没有使用它,但看起来它符合要求。
答案 3 :(得分:1)
据我所知,我选择实施全班:
class Chip
{
map<RegisterLocation, Register> RegistersPerLocation;
public:
void AddRegisterPerLocation(RegisterLocation, Register);
};
class Register
{
map<CellLocation, Cell> CellsPerLocation;
public:
void AddCellPerLocation(CellLocation, Cell);
};
// etc..