6
votes

Triple carte comprenant 2 clés

J'ai une structure contenant 3 champs, deux int code> s (appelons-les A forts> et B EM>) em> et un bool code> ( C fort>) em>.

Je veux créer une sorte de tableau de cette structure et être capable d'y accéder à travers tout des clés (A ou B), obtenez l'objet du trou (avec A, B et C) en retour. Je n'aurai pas besoin de faire quelque chose comme "Obtenir tout l'objet pour lequel le Bool est vrai", si cela fait de la différence. P>

Évidemment, les deux essences sont uniques et le Bool ne peut pas être, mais Je pensais que je le mentionnerais pour la clarté. P>

S'il n'y avait pas de A ou B, ce serait un simple std :: mapper code>. P>

La seule solution que je vois actuellement est de créer un wrapper contenant 2 définir code> s et un vecteur code>. Y a-t-il un moyen de rendre ma vie plus facile? P>

NB: il contiendra au plus de cent tuples, la performance ne devrait donc pas être un problème. L'accès linéaire est acceptable. Em> p>

Pour le rendre plus clair, voici ce que j'aimerais pouvoir faire: p>

foobar<int, int, bool> array;  // or something along those lines

array.add(1, 101, true);
array.add(2, 102, false);

array.getA(1); // returns first object
array.getA(2);   // returns second object
array.getB(102); // returns second object again


2 commentaires

Si ceci est votre exigence réelle (INT, INT, BOOL) et non un exemple de coupure, je le ferais simplement avec deux cartes ( carte ), un pour A et un pour B.


Il s'agit d'un exemple de coupure, mais surtout, cette solution aurait besoin d'une enveloppe de toute façon pour conserver le 2 bool s en synchronisation.


4 Réponses :


0
votes

Je sais que je n'ai pas donné la mise en œuvre de détail. Mais je suggère simplement une logique avec deux cartes. Qu'est ce qui ne va pas avec ça? Pourquoi est-ce que je suis descendu? XXX


13 commentaires

Je ne suis pas un downwoter, mais vous ne pouvez pas obtenir un objet entier pour B .


@son Qu'est-ce que "objet trou"?


C'était une faute de frappe. Objet entier.


@son j'ai mis à jour ma réponse. Qu'entendez-vous par «impossible d'obtenir un objet entier»?


Même après la modification, vous pouvez uniquement geler bool une partie de l'objet pour B .


@son je vois. J'ai mal compris la demande d'OP.


Non, qu'est-ce que p et pourquoi est-il nécessaire?


@son Oops, désolé pour l'erreur. C'est une variable locale.


Agréable. Mais pourquoi est-il nécessaire? En outre, vous avez une fuite de mémoire ici.


@son Oh..Je carte de pensée accepterait une référence..mais-tu voulu dire que cela copie en fait les données?


Je suggère également de renvoyer les références de const, car vous ne pouvez pas modifier les valeurs - elle brisera la recherche.


Oui. Sera préférable de mettre tout l'intérieur d'une classe pour éviter les variables mondiales. De plus, alors que d'autres réponses sont préférables (elles sont meilleures, aucune infraction), je ne vois aucune raison de la bowvote maintenant. Compensé.


@son c'est très gentil de votre part!



1
votes

La suggestion de diviser en deux cartes est certainement un peu plus simple, mais si vous voulez une plus grande flexibilité et peut utiliser C ++ 11 pour des fonctionnalités telles que std :: tuple , vous pourriez essayer Quelque chose de la forme: xxx

Un exemple de travail donne la sortie 1, 102 , 0 (faux).


1 commentaires

Eh bien, c'est à peu près l'emballage que j'avais à l'esprit, même si ce serait beaucoup plus grand. Merci!



6
votes

Je crois ce que vous recherchez est Boost :: Multi_index . Il vous permettra de déclarer un conteneur avec plusieurs indices.

struct MultiIDStruct
{
    size_t idA;
    size_t idB;
    std::string name;
};

namespace mul = boost::multi_index;

boost::multi_index_container< MultiIDStruct, 
    mul::indexed_by< 
        mul::ordered_unique< mul::member< MultiIDStruct, size_t, &MultiIDStruct::idA > >,
        mul::ordered_unique< mul::member< MultiIDStruct, size_t, &MultiIDStruct::idB > > 
    > > data;


2 commentaires

Vous pouvez raccourcir cela en faisant Nomspace Mul = Boost :: Multi_index ou quelque chose.


Cela semble parfait. J'y regarderai plus en profondeur demain et déciderai si je préfère la solution de cette ou Ryanmck.



0
votes

avoir le même problème, et une solution différente!

avoir deux fonctions de hachage sur A et B, donnant H1 (A) et H2 (B), telles que elles ne donnent pas de valeurs égales. Exemple: P>

uint32_t A;
uint32_t B;

uint64_t hashA(uint32_t value)
{ return ((uint64_t)value) << 32; }

uint64_t hashB(uint32_t value)
{ return (uint64_t)value; }


0 commentaires