J'ai une structure contenant 3 champs, deux 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 La seule solution que je vois actuellement est de créer un wrapper contenant 2 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> int code> s (appelons-les
bool code> ( C fort>) em>.
std :: mapper
définir code> s et un
vecteur code>.
Y a-t-il un moyen de rendre ma vie plus facile? 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
4 Réponses :
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?
Je ne suis pas un downwoter, mais vous ne pouvez pas obtenir un objet entier pour B code>.
@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 code> une partie de l'objet pour
B code>.
@son je vois. J'ai mal compris la demande d'OP.
Non, qu'est-ce que p code> 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!
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 Un exemple de travail donne la sortie 1, 102 , 0 (faux). P> p> std :: tuple code>, vous pourriez essayer Quelque chose de la forme:
Eh bien, c'est à peu près l'emballage que j'avais à l'esprit, même si ce serait beaucoup plus grand. Merci!
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;
Vous pouvez raccourcir cela en faisant Nomspace Mul = Boost :: Multi_index code> 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.
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; }
Si ceci est votre exigence réelle (INT, INT, BOOL) et non un exemple de coupure, je le ferais simplement avec deux cartes (
carte code>), 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 code> s en synchronisation.