2013-02-15 4 views
5

ペアのベクトルのイテレータでペアの値にアクセスすると、次のようなエラーが発生します。ペアのベクトルから値を取得する際にエラーが発生しました

vector< pair<int,string> > mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (vector< pair<int,string> >::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << *it.first << " "   // <-- error! 
     << "2nd: " << *it.second << endl;  // <-- error! 
} 

エラーメッセージ:

main_v10.cpp:165:25: error: ‘std::vector > >::iterator’ has no member named ‘first’ main_v10.cpp:165:56: error: ‘std::vector > >::iterator’ has no member named ‘second’

がどのように私はこの問題を解決することができますか?

+1

オペレータの優先順位をチェックし、 '*'と '.'優先順位を読み取ることができます: http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B – billz

答えて

7

これはポインタにも当てはまる問題です(イテレータはポインタのように動作します)。値のメンバーのポインタ(またはイテレータ)にアクセスするには、2つの方法がありますポイントに:

it->first  // preferred syntax: access member of the pointed-to object 

または

(*it).first // verbose syntax: dereference the pointer, access member on it 

演算子の優先順位は

*(it.first) // wrong! tries to access a member of the pointer (iterator) itself 

にあなたの表現を回しますイテレータ自体のメンバfirstにアクセスしようとしますが、そのメンバにはfirstというメンバがないため失敗します。そうした場合は、そのメンバーの値を逆参照します。


しかし、ほとんどのような場合には、あなたは、値にキーからマップするためにstd::mapを使用する必要があります。本質的な違いという

map<int,string> mapper; 
if(Hash(input, chordSize) != id){ 
    mapper.push_back(make_pair(tmp, input)); 
} 

for (map<int,string>::iterator it = mapper.begin(); it != mapper.end(); ++it) 
{ 
    cout << "1st: " << it->first << " " 
     << "2nd: " << it->second << endl; 
} 

注:代わりにvector<pair<int,string> >、あなたは(挿入、反復とかもペアで発生)と同様の振る舞いが、それはより速くランダムアクセスするためのデータ構造のキーをソートmap<int,string>を使用する必要がありますマップとペアのベクトルは、マップが要素をキーでソートして並べ替えることです。その後、挿入の順序を照会することはできません。あなたがそれをしたくないケースがあります(挿入オーダーが重要な場合)ので、あなたのソリューションか、少なくともキーと値を含むカスタムタイプのベクトルが正しい解決法です。

+0

私は第2変形が'(*それ)。最初の ' –

+0

@ g-makulikもちろん、ありがとう。 – leemes

+0

はい、2番目のオプションは正しいです!ありがとう。あなたは素晴らしいです! –

関連する問題