7
votes

Problèmes en utilisant une carte avec un bitset comme clé

J'essaie de créer un mappe en C ++ avec bitset en tant que clé. Cependant, le compilateur génère les messages d'erreur suivants xxx

Le code PROGAM est donné ci-dessous J'essaie d'utiliser Bitset comme une clé pour une carte en C ++. Cependant, chaque fois que j'exécute le code ci-dessous, je rencontre des errros. xxx


0 commentaires

5 Réponses :


5
votes

Utilisez simplement votre propre classe de comparaison: xxx

Notez que vous pouvez étendre cette solution pour supporter des bits de longueur arbitraire, tant qu'ils sont suffisamment petits pour être convertis en une longueur non signée: < / p> xxx


8 commentaires

Remarque: to_ulong ne fonctionne que si un non signé INT peut contenir le résultat, et non signé INT n'est que garanti par la norme d'au moins 16 bits, ce qui n'est pas grand chose.


Oui, j'ai signalé cela dans la solution modélisée. Merci pour la clarification de toute façon.


@Matthieum.: TO_ULONG (comme son nom l'indique) se convertit à un peu non signé longtemps, nous avons donc 32 bits garantis ici.


@Fontanini: Utilisez simplement le même type que STD :: Bitset fait pour le paramètre Taille (Taille_T). Vous préférez peut-être également nommer la structure par exemple. Bitset_less doit souligner que c'est pour les bits de bits spécifiquement. Ou vous pouvez spécialiser STD :: moins pour Bitsets.


@Plasmahh: Oupls à droite, je me suis glissé là-bas. Cependant, cela ne change pas le problème fondamental.


@Cwan, j'ai raté le paramètre Taille_T. Merci, je l'ai réparé.


@MFontanini Qu'en est-il de si un non signé long est suffisant? Peut-être que si le non signé long est suffisant, vous n'avez pas besoin d'utiliser le bitset ...


@VTS_CVS Le code de OP utilise des bits de bits de 8 bits, de sorte que la conversion à une longueur non signée est sûrement suffisante ici. Sur une autre situation, vous pouvez utiliser une autre approche.



1
votes

Vous pouvez définir votre fonction de comparaison. Si vous supposez votre Bitset code> une valeur intégrale non signée, la fonction suivante doit commander le bitset code> s dans la commande croissante (et fonctionne pour tout n code>) .

mymap[0]    is the pair ((0,0,0,0,0,0,0,0,0,0), 0)  
mymap[1]    is the pair ((1,0,0,0,0,0,0,0,0,0), 1)  
mymap[2]    is the pair ((0,1,0,0,0,0,0,0,0,0), 2)  
mymap[3]    is the pair ((1,1,0,0,0,0,0,0,0,0), 3)  
mymap[4]    is the pair ((0,0,1,0,0,0,0,0,0,0), 4)  
mymap[5]    is the pair ((1,0,1,0,0,0,0,0,0,0), 5)  
mymap[6]    is the pair ((0,1,1,0,0,0,0,0,0,0), 6)  
mymap[7]    is the pair ((1,1,1,0,0,0,0,0,0,0), 7)  
mymap[8]    is the pair ((0,0,0,1,0,0,0,0,0,0), 8)  
mymap[9]    is the pair ((1,0,0,1,0,0,0,0,0,0), 9)


0 commentaires

0
votes

Ceci permettra à la carte , int> Stuff directement : xxx


0 commentaires

2
votes

Une solution alternative consisterait simplement à utiliser un unomment_map , si cela répond toujours à vos besoins.

Ceci pourrait être STD :: Unommked_map , T > ou Boost :: Unommked_map , t> , selon la version C ++ ou Considérations sur la performance .

Cela évite le besoin de comparaison et peut prouver plus rapidement , en fonction des exigences.


0 commentaires

0
votes

Pour stocker sur la carte, vous pouvez convertir Bitset à la chaîne pour les gros bitset s'il n'est pas convertible en U_LONG et pour la mise à jour Vous pouvez passer à Bitset et effectuer vos modifications et stocker en tant que chaîne.

map<string , int> mymap;
bitset<N> mybs("10100"); // converting string to bitset
map[mybs.to_string()] = 34; // bitset to string for map


0 commentaires