2010-07-18 19 views
27

Voglio usare una coppia da STL come chiave di una mappa.Utilizzo della coppia come chiave in una mappa (C++/STL)

#include <iostream> 
#include <map> 

using namespace std; 

int main() { 

typedef pair<char*, int> Key; 
typedef map< Key , char*> Mapa; 

Key p1 ("Apple", 45); 
Key p2 ("Berry", 20); 

Mapa mapa; 

mapa.insert(p1, "Manzana"); 
mapa.insert(p2, "Arandano"); 

return 0; 

} 

Ma il compilatore gettare un mucchio di informazioni illeggibili e io sono molto nuovo per C e C++.

Come posso utilizzare una coppia come chiave in una mappa? E in generale Come posso usare qualsiasi tipo di struttura (oggetti, strutture, ecc.) Come chiave in una mappa?

Grazie!

+7

In futuro, si prega di inviare i messaggi di errore che si ottiene. Altrimenti, può essere spesso difficile o impossibile per le persone aiutarti. :) –

+2

Se pubblichi gli errori, sono sicuro che potremmo anche aiutarti a spiegare cosa significano e come puoi interpretarli quando li vedi in futuro. –

+1

Si noti che, utilizzando i valori letterali stringa, vengono confrontati gli _addresses_ delle stringhe, non le stringhe. Faresti meglio a usare 'std :: string'. – sbi

risposta

28

std::map::insert prende un singolo argomento: la coppia chiave-valore, quindi è necessario utilizzare:

mapa.insert(std::make_pair(p1, "Manzana")); 

Si consiglia di utilizzare std::string invece di stringhe C nei vostri tipi. Come è ora, probabilmente non otterrai i risultati che ti aspetti perché la ricerca dei valori nella mappa sarà effettuata confrontando i puntatori, non confrontando le stringhe.

Se si desidera utilizzare le stringhe C (che, anche in questo caso, non è necessario), è necessario utilizzare const char* anziché char* nei tipi.

E in generale Come posso utilizzare qualsiasi tipo di struttura (oggetti, strutture, ecc.) Come chiave in una mappa?

È necessario sovraccaricare operator< per il tipo di chiave o utilizzare un comparatore personalizzato.

+2

'mapa [p1] =" Manzana ";' è ancora più corto –

+2

@Peter: 'operator []' ha una semantica diversa, e mi raccomando di non usarlo per inserire oggetti in una 'map' (inserisce un nuovo oggetto se uno non esiste già, sovrascrive immediatamente l'oggetto temporaneo appena creato). –

+0

Wow Questo è stato un brutto errore, ho dimenticato di fare la coppia. Mi dispiace! Bene funziona ora ma non ha funzionato quando stavo usando char * invece di const char *. In questo caso, qual è l'accordo con const char * vs char *? Grazie! – ccarpenterg

6

Ecco una riscrittura di lavoro del codice in questione:

#include <map> 
#include <string> 

class Key 
{ 
    public: 
    Key(std::string s, int i) 
    { 
     this->s = s; 
     this->i = i; 
    } 
    std::string s; 
    int i; 
    bool operator<(const Key& k) const 
    { 
     int s_cmp = this->s.compare(k.s); 
     if(s_cmp == 0) 
     { 
     return this->i < k.i; 
     } 
     return s_cmp < 0; 
    } 
}; 

int main() 
{ 


    Key p1 ("Apple", 45); 
    Key p2 ("Berry", 20); 

    std::map<Key,std::string> mapa; 

    mapa[p1] = "Manzana"; 
    mapa[p2] = "Arandano"; 

    printf("mapa[%s,%d] --> %s\n", 
    p1.s.c_str(),p1.i,mapa.begin()->second.c_str()); 
    printf("mapa[%s,%d] --> %s\n", 
    p2.s.c_str(),p2.i,(++mapa.begin())->second.c_str()); 

    return 0; 
} 
+2

perché? come va meglio di ciò che l'OP aveva con 'coppia'? – user102008

+6

Um, perché compila ed esegue correttamente? –

+0

l'operatore <'forse non è come preimpostato come std :: pairs's. – Jichao

1

In alternativa a ciò che James McNellis ha dichiarato:

mapa.insert(std::make_pair(p1, "Manzana")); 

si potrebbe usare mapa.insert({p1, "Manzana"});

-1

Non usare mai questo per risolvere la programmazione competitiva .Perché penso che la sua complessità sia superiore a log (n). Quindi, pensare alternativa ..

+2

Questa non è davvero una risposta - non hai detto quello che dovrebbe DOVREBBE fare – yakobom

0

Questo è farà esattamente quello che vuoi

#include<bits/stdc++.h> 
using namespace std; 
int main() 
{ 
    map<pair<string, long long int>, string> MAP; 
    pair<string, long long int> P; 
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Apple", 45), "Manzana")); 
    MAP.insert(pair<pair<string, long long int>, string>(pair<string, long long int>("Berry", 20), "Arandano")); 
    P = make_pair("Berry", 20); 
    //to find berry, 20 
    cout<<MAP[P]<<"\n"; 
    return 0; 
} 
Problemi correlati