1

次の型定義を持つマップで構成されるベクトルがあります。

std::map< int, std::vector<int> >

したがって、ベクトル自体の定義は次のとおりです。

std::vector< std::map< int, std::vector<int> > >

ここで、整数のベクトルを作成し、整数キーを使用してマップに挿入し、マップ自体を外側のベクトルに追加しています。

    std::map<int, std::vector<int> > vDescriptorAtom;
    vDescriptorAtom.insert( std::make_pair(498, vListOfIds) );
    messageDescriptorVector.push_back( vDescriptorAtom );

vListOfIds 自体は整数のベクトルです。

後の段階で、内側のベクトルを抽出し、所有している別のベクトルと比較したいと考えています。2 つのベクトル間の演算子を簡単に使用==して比較できるという印象を受けました。しかし、私はこれを行うのに問題があります。

私は試した:

               for ( int i = 0 ; i <= messageDescriptorVector.size(); i++ )
                {    
                    if ( current_tag_stack == (messageDescriptorVector.at(i))->second )
                    {
                        vFoundMatchingDescriptor = true;
                        break;
                    }
                } 

current_tag_stack には次の定義があることに注意してください。

std::vector<int> current_tag_stack;

しかし、私はこのエラーが発生しています:

base operand of â->â has non-pointer type âstd::map<int, std::vector<int, std::allocator<int> >, std::less<int>, std::allocator<std::pair<const int, std::vector<int, std::allocator<int> > > > >â

私は何を間違っていますか?

編集

コメントで示唆されているように、マップ内に保存したベクトルにアクセスしようとしましたが、次のmessageDescriptorVector.at(i).secondエラーが発生しています:âclass std::map<int, std::vector<int, std::allocator<int> >, std::less<int>, std::allocator<std::pair<const int, std::vector<int, std::allocator<int> > > > >â has no member named âsecondâ

4

3 に答える 3

1

マップで member second にアクセスしようとしているという問題は別として、コードで typedef を使用することをお勧めします。コードを簡素化するだけでなく、必要に応じてデータ構造を変更するのにも役立ちます。あなたの場合、コード全体のこの定義はすべて次のとおりです。

std::map< int, std::vector<int> >
std::vector< std::map< int, std::vector<int> > >
std::map<int, std::vector<int> > vDescriptorAtom;
std::vector<int> current_tag_stack;

それを比較してください:

typedef std::vector<int> tag_stack;
typedef std::map<int,tag_stack> tag_stack_map;

tag_stack_map vDescriptorAtom;
tag_stack current_tag_stack;

そして、ある日、tag_stack を std::vector から別のものに変更する必要があると想像してください。どこが簡単になりますか?

于 2013-10-23T14:02:57.463 に答える