2012-04-12 7 views
0

ich einen Code in c habe ++ mit stl Karte mit dem zweiten Parameter als ein Paar definiertEs schlägt fehl, eine C++ Map-Struktur als Karte zu kompilieren <A, paaren <B, C>>

int keys[10] = {1, 1, 1, 2, 3, 4, 5, 7, 6, 6}; 
char s[5]; 
map< unsigned int, pair<string, int> > tmpMap; 

for (int i=0; i<10; i++) 
{ 
    if (tmpMap.find(keys[i])==tmpMap.end()) 
    { 
    sprintf(s, "%i", keys[i]); 
    tmpMap.insert(make_pair(keys[i], make_pair(s, 1))); 
    } 
    else tmpMap[keys[i]].second++; 
} 

for (map< unsigned int, pair<string, int> >::iterator it=tmpMap.begin(); it!=tmpMap.end(); ++it) 
{ 
cout << (*it).first << " " << (*it).second << endl; 
} 

Aber es nicht, es zu kompilieren, sagte, keine Übereinstimmung Operator < <. Aber (* it) .first und (* it) .second sind nur string und int, warum funktioniert es nicht?

+0

Wäre nicht (* it) .first ein unsigned int, und (* it) .sowd be pair ? –

Antwort

9

Das ist nicht wahr, first ist ein unsigned int, während second ein pair<string,int> weil der Iterator einer Karte ist nicht direkt das Paar geben, aber das Paar Schlüssel, Wert.

Ich denke, man sollte

tun
pair<string,int> pair = (*it).second; 
cout << pair.first << " " << pair.second << endl; 
+0

Ich denke, er könnte die Referenz von (* es). Sekunde verwenden, es sei denn, eine Kopie jedes Mal durchzuführen ist in Ordnung. –

+0

Ja, es ist in der Tat eine Verschwendung von Kopien. – Jack

+2

Fügen Sie '' 'hinzu, um das Kopieren zu vermeiden:' pair & pair = (* it) .second; ' – detunized

1

Ihr (* it) .second Paar ist, müssen Sie

cout << (*it).first << " " << (*it).second.first << " " << 
(*it).second.first << endl; 

haben diese da, wenn sie über Karte Iterieren Sie Paar zu bekommen, dann erstens ist der Schlüssel und zweitens ist der Wert - in Ihrem Fall auch ein Paar.

Verwandte Themen