2012-04-12 6 views
0

私はペアこれは、マップ<A、ペア<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; 
} 

として定義される第2のパラメータを持つSTLのmapとC++のコードを持っている。しかし、それはコンパイルに失敗すると、C++マップ構造のコンパイルに失敗し、それ言った、マッチオペレータなし< <。しかし(* it).firstと(* it).secondは単なる文字列とintで、なぜ機能しないのですか?

+0

(* it)。最初は符号なしintであり、(* it).secondはペアとなりますか? –

答えて

9

真実ではないsecondpair<string,int>いる間にマップのイテレータが直接ペアが、カップルのキー、値をあなたを与えるものではありませんので、firstは、unsigned intです。

は、私はあなたが行う必要がありますね

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

私は彼が(* it).secondのリファレンスを使用したいと思っています。 –

+0

はい、本当にコピーの無駄です。 – Jack

+2

コピーを避けるために '&'を追加してください: '&pair =(* it).second;' – detunized

1

あなた(*それ).secondペア、あなたがして、このマップの繰り返し処理を行う場合、以来、あなたが取得されたペアを

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

を持っている必要がありますされます最初はキー、2番目は値です - あなたの場合もペアです。

関連する問題

 関連する問題