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: エラー: 'std::vector > >::iterator' には 'first' という名前のメンバーがありません main_v10.cpp:165:56: エラー: 'std::vector > >::iterator' には'second' という名前のメンバーはありません</p>

どうすればこれを修正できますか?

4

1 に答える 1

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、キーから値へのマッピングに使用する必要があります。の代わりにvector<pair<int,string> >、同じように動作する which を使用する必要がありますmap<int,string>(挿入、反復などもペアで発生します) が、より高速なランダム アクセスのためにデータ構造内のキーを並べ替えます。

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;
}

マップとペアのベクトルの本質的な違いは、マップは要素をキーで並べ替えて再配置することです。挿入の順序を後で照会することはできません。これを行いたくない場合 (挿入順序が重要な場合) もあるため、そのような場合は、ソリューションまたは少なくともキーと値を含むカスタム型を持つベクターが正しいソリューションです。

于 2013-02-15T07:41:15.393 に答える