Question

Souvent, je suis amené à définir un conteneur pour des données multidimensionnelles.

Prenons un exemple: j'ai plusieurs puces, chaque puce a plusieurs registres, chaque registre a plusieurs cellules et chaque cellule contient plusieurs transistors.

À un moment donné de mon programme C ++, je dois lire ces données et, plus tard, je dois les utiliser.

Je ne peux utiliser aucun stockage externe pour ces données: fichier, base de données, etc.

Alors, devrais-je créer un conteneur STL multi-dimensionnel? Une carte de cartes de vecteurs, ou quelque chose comme ça ...?

Ou devrais-je créer des classes (structures) pour chacune d’elles? Classe de cellule contenant un vecteur de transistors, puis une classe de registre contenant un vecteur de cellules, etc.? Mais que se passe-t-il si plus tard, je veux accéder à mes données par Transistor et non par puce?

Autre moyen?

Merci

EDIT: oublié de mentionner: je ne peux pas utiliser de boost.

Était-ce utile?

La solution

Implémentez des classes complètes pour eux. Votre code sera finalement plus propre.

Chaque fois que j'ignore cet axiome, il revient me hanter. J'ai implémenté une collection hiérarchique de chaînes à 3 niveaux en termes de std :: pairs de std :: strings et de std: pairs. C'était simple et rapide, et quand j'ai dû remplacer une couche, puis une autre, par une classe contenant des attributs supplémentaires, cela était étonnamment facile à faire. Mais au final, le code était en désordre et je n'étais pas content de le documenter. Leçon apprise encore, et encore, et encore ...

Autres conseils

Vous devez mapper votre domaine.

  

Alors, devrais-je créer un conteneur STL multi-dimensionnel? Une carte de cartes de vecteurs, ou quelque chose comme ça ...?

Chaque vecteur / carte contiendra des objets d’un certain type. Cela nous amène à votre prochaine question:)

  

Ou devrais-je créer des classes (structures) pour chacune d’elles?

On dirait que c'est ce dont vous avez besoin au minimum.

  

Classe de cellule contenant un vecteur de transistors, puis une classe de registre contenant un vecteur de cellules, etc.?

Regardez à la fois a-un et est mis en œuvre en termes de designs.

  

Mais si je veux ensuite trier mes données par transistor et non par puce?

Quelles données? Vous pouvez toujours faire circuler des comparateurs en fonction du contexte. Demandez-vous également si vous devez réellement exposer les détails du niveau Transistor à une personne travaillant avec une puce . Cela vous aidera à démarrer.

Si vous souhaitez accéder à vos données via différentes "dimensions", " vous pouvez être intéressé par boost :: multi_index_container . Je ne l'ai pas utilisé moi-même, mais il semble que cela convienne à la facture.

Comme conseillé, j'ai choisi d'implémenter des classes complètes:

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

};

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

// etc..
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top