2017-09-22 10 views
-1

Voici mon code.unordered_map <(int ou string), MyClass> Comment accéder et imprimer les éléments de MyClass

#include <iostream> 
#include <string> 
#include <unordered_map> 


using namespace std; 

class Token { 
    string strVar; 
    int intVar; 
    bool boolVar; 

public: 
    Token(string strVar, int intVar ,bool boolVar): 
     strVar(strVar), intVar(intVar) ,boolVar(boolVar){ 
    } 

    string getStrVar() {return this->strVar;} 
    int getIntVar()  {return this->intVar;} 
    bool getBoolVar() {return this->boolVar;} 

}; 

int main(){ 
    unordered_map<int , int> mymap; 
     //I WANT -> unordered_map<int , Token> mymap; 

    mymap[1]= 11; 
     //I WANT -> // mymap[1] = Token("string1", 1, true); 
    mymap[2]= 12; 
     //I WANT -> // mymap[2] = Token("string2", 2, false); 
    mymap[3]= 13; 
     //I WANT -> //mymap[3] = Token("string3", 3, true); 

    int tk = mymap[1]; 
     //I WANT -> //Token tk = mymap[1]; 
    mymap[3] = tk; 

    for (auto& x: mymap) { 
     cout << x.first << ": " << x.second << endl; 
     //I WANT -> print all Var from MyClass, 
     //for example, x.second.getStrVar() << x.second.getIntVar() << x.second.getBoolVar() << endl; 
    } 

    return 0; 
} 

SORTIE Atual:

3: 11 
2: 12 
1: 11 

Comme je l'ai expliqué dans les commentaires, comment puis-je utiliser la fonction <> unordered_map avec ma classe et boucle à travers vos éléments afin que je puisse utiliser les méthodes de la classe???

J'ai besoin de cette sortie:

string1 1 true 
string2 2 true 
string1 1 true 
+2

Vous devriez être en mesure de le faire plus ou moins comme vous l'avez fait dans les parties en commentaire. Quel est exactement le problème que vous rencontrez lorsque vous l'essayez de cette façon? –

+0

@SeanBurton Quand j'ai couru j'ai eu cette erreur suivante: pour (auto & x: mymap) { XXX cout << x.first << ":" << x.second << endl; } 45 | erreur: impossible de lier 'std :: basic_ostream ' lvalue à 'std :: basic_ostream &&' | Et parfois ouvrir une archive "/ include/tuple" C: \ Program Files (x86) \ CodeBlocks \ MinGW \ lib \ gcc \ mingw32 \ 4.9.2 \ include \ C++ \ tuple | 1102 | erreur: aucune correspondance fonction pour appel à 'Token :: Token()' | – Guttizin

+0

Pouvez-vous poster le code complet et exact qui produit réellement l'erreur ... –

Répondre

1

argument de type de carte doit être par défaut constructible. Cela signifie que vous devez déclarer le constructeur par défaut pour votre Token de classe.

EDIT Eh bien, pas exactement l'argument de type de mappage, mais l'argument operator [] de Map tel qu'il est spécifié here on cppreference.com.

De plus, pour l'imprimer en boucle, vous devez définir un opérateur de sortie (opérateur < <) pour votre classe.

Votre code de travail:

#include <iostream> 
#include <string> 
#include <unordered_map> 

using namespace std; 

class Token { 
    string strVar{}; 
    int intVar{}; 
    bool boolVar{}; 

public: 

    Token() {}; 

    Token(string strVar, int intVar ,bool boolVar): 
     strVar(strVar), intVar(intVar) ,boolVar(boolVar){ 
    } 

    string getStrVar() {return this->strVar;} 
    int getIntVar()  {return this->intVar;} 
    bool getBoolVar() {return this->boolVar;} 

    friend std::ostream& operator<< (std::ostream& out, const Token& rhs) { 
     out << rhs.strVar; 
    } 

}; 

int main(){ 
     //unordered_map<int , int> mymap; 
     //I WANT -> // 
    unordered_map<int , Token> mymap; 

     //mymap[1]= 11; 
     //I WANT -> // 
    mymap[1] = Token("string1", 1, true); 
     //mymap[2]= 12; 
     //I WANT -> // 
    mymap[2] = Token("string2", 2, false); 
     //mymap[3]= 13; 
     //I WANT -> // 
    mymap[3] = Token("string3", 3, true); 

     //int tk = mymap[1]; 
     //I WANT -> // 
    Token tk = mymap[1]; 
    mymap[3] = tk; 

    for (auto& x: mymap) { 
     cout << x.first << ": " << x.second << endl; 
     //I WANT -> print all Var from MyClass, 
     //for example, x.second.getStrVar() << x.second.getIntVar() << x.second.getBoolVar() << endl; 
    } 

    return 0; 
} 
+0

Avec le constructeur par défaut, le code compile https://ideone.com/s0LTcf mais je peux Ne pas trouver pourquoi le constructeur par défaut est nécessaire. 'std :: unordered_map répond aux exigences de Container, AllocatorAwareContainer, UnorderedAssociativeContainer.' et dans aucun d'entre eux je ne vois cette exigence. –

+0

Mais j'ai déjà un constructeur, n'est-ce pas? Comme: Token (string strVar, int intVar, bool Boolvar): strVar (strVar), intVar (intVar), Boolvar (Boolvar) {} @Caribou Que voulez-vous dire "pour définir l'opérateur"? – Guttizin

+0

@MateuszDrost J'ai édité ma réponse avec une petite clarification et un lien vers cppreference, où il est expliqué avec précision. – Outshined