À l'aide d'un tuple dans unordered_map
Je veux utiliser un tuple composé de int
,char
,char
dans mon unordered_map
. Je fais comme ceci:
#include <string>
#include <unordered_map>
#include <cstring>
#include <iostream>
#include <tuple>
using namespace std;
tuple <int,char,char> kk;
unordered_map<kk,int> map;
int main()
{
map[1,"c","b"]=23;
return 0;
}
mais cela me donne des erreurs suivantes:
map.cpp:9:21: error: type/value mismatch at argument 1 in template parameter list for ‘template<class _Key, class _Tp, class _Hash, class _Pred, class _Alloc> class std::unordered_map’
map.cpp:9:21: error: expected a type, got ‘kk’
map.cpp:9:21: error: template argument 3 is invalid
map.cpp:9:21: error: template argument 4 is invalid
map.cpp:9:21: error: template argument 5 is invalid
map.cpp:9:26: error: invalid type in declaration before ‘;’ token
map.cpp: In function ‘int main()’:
map.cpp:14:16: error: assignment of read-only location ‘"b"[map]’
Ce que je fais de mal?
OriginalL'auteur Xara | 2013-12-30
Vous devez vous connecter pour publier un commentaire.
Les arguments de modèle pour une unordered_map ressemble à ceci:
std::hash
est pas spécialisé pour les n-uplets (faites défiler vers le bas à la Norme spécialisations pour les types de bibliothèques). Par conséquent, vous devez fournir votre propre, quelque chose comme ceci:Et enfin, Benjamin Lindley réponse déjà des adresses, vous devez utiliser
std::make_tuple
:Le code a été saisi de À l'aide d'un std::tuple comme la clé de std::unordered_map et voici le Live Exemple.
Voir le lien pour plus d'informations.
key_hash
est défini ci-dessus. Plus tard, nous l'utilisons comme un des arguments de modèle (où unordered_map nécessite une table de Hachage).XOR avec les champs est un terrible fonction de hachage. S'il vous plaît ne pas utiliser ce code comme-est. Voir, par exemple, open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3876.pdf
OriginalL'auteur
Première erreur:
Que l'erreur est clairement dit, le paramètre de modèle doit être d'un type.
kk
n'est pas un type, c'est un objet. Peut-être que vous vouliez en faire un typedef?Deuxième erreur:
Deux problèmes ici. Tout d'abord, de mettre des virgules entre les valeurs n'est pas un n-uplet. Vous avez besoin d'être explicite à ce sujet, soit en appelant le constructeur de votre tuple de type, ou à l'aide d'une fonction qui retourne un tuple (par exemple
std::make_tuple
). Deuxièmement, votre tuple attend caractères ('c','b'
), pas de cordes ("c","b"
).Non, je n'ai pas upvote encore btw merci pour éclaircir les choses. 🙂
Je n'étais pas à croire qu'il a été vous. Mais celui qui il était, c'était comme 2 secondes après que j'ai cliqué sur télécharger.
OriginalL'auteur Benjamin Lindley
Comme l'a souligné, std::hash n'est pas spécialisé pour les n-uplets. Toutefois, si votre tuple se compose de la norme hashable des types comme string et int, le code suivant à partir de générique-hash-pour-tuples-en-non-ordonnée-carte-non-ordonnée-set ajoutera automatiquement un tel soutien en c++11.
Il suffit de coller le code dans un fichier d'en-tête et de les inclure à chaque fois que nécessaire:
OriginalL'auteur Leo Goodstadt
J'avais une exigence de la carte à la place de non-ordonnée de la carte:
la clé était de 3-n-uplet et
la valeur est un 4-tuple
voir toutes les réponses, j'ai été sur le point de changer de paires de
mais, au-dessous fonctionné pour moi:
Je suis à l'aide de visual studio community 2015 ide
OriginalL'auteur Manohar Reddy Poreddy
Ici est une méthode à utiliser un tuple comme un élément clé pour une unordered_map sans l'aide d'un hachage de spécialisation:
De sortie est:
OriginalL'auteur edW