質問
多くの場合、多次元データのコンテナを定義する必要があります。
例を見てみましょう:私は多くのチップを持っています、各チップは多くのレジスタを、各レジスタは多くのセルを、そして各セルは多くのトランジスタを持っています。
C ++プログラムのある段階で、このデータを読み取らなければならず、後で使用する必要があります。
このデータに外部ストレージを使用できません:ファイル、データベースなど
では、多次元STLコンテナを作成する必要がありますか?ベクトルのマップのマップ、またはそのようなもの...?
または、それぞれにクラス(構造)を作成する必要がありますか?トランジスタのベクトルを含むセルクラス、セルのベクトルを含むレジスタクラスなど?しかし、後でチップではなくトランジスタでデータにアクセスしたい場合はどうなりますか?
その他の方法?
ありがとう
編集:言及するのを忘れました:ブーストを使用できません。
解決
完全なクラスを実装します。コードは最終的にすっきりします。
この公理を無視するたびに、それは私を悩ませるようになります。 std :: stringsとstd:pairsのstd :: pairsの観点から、階層的な3層の文字列コレクションを実装しました。それは迅速かつ簡単で、追加の属性を含めるために、あるレイヤーと別のレイヤーをクラスで置き換える必要があったとき、驚くほど簡単でした。しかし、最終的に、コードは混乱し、ドキュメント化するのは不愉快でした。レッスンは何度も何度も学びました...
他のヒント
ドメインをマッピングする必要があります。
では、多次元STLコンテナを作成する必要がありますか?ベクトルのマップのマップ、またはそのようなもの...?
各ベクター/マップには、何らかのタイプのオブジェクトが含まれます。次の質問に進みます:)
または、それぞれにクラス(構造)を作成する必要がありますか?
このように見えることは、少なくとも必要なものです。
トランジスタのベクトルを含むセルクラス、およびセルのベクトルを含むレジスタクラスなど
has-a
と is-implemented-in-terms-of
の両方のデザインを見てください。
しかし、後でチップではなくトランジスタでデータをソートしたい場合はどうなりますか?
どのデータですか?コンテキストに応じて、いつでもコンパレータを渡すことができます。また、 Transistor
レベルの詳細を Chip
で作業している人に公開する必要があるかどうかを自問してください。始めるのに役立ちます。
さまざまな「ディメンション」に沿ってデータにアクセスする場合は、 boost :: multi_index_container
。私自身は使用していませんが、法案に合っているようです。
助言されたように、私は完全なクラスを実装することを選択しました:
class Chip
{
map<RegisterLocation, Register> RegistersPerLocation;
public:
void AddRegisterPerLocation(RegisterLocation, Register);
};
class Register
{
map<CellLocation, Cell> CellsPerLocation;
public:
void AddCellPerLocation(CellLocation, Cell);
};
// etc..