1

文字列キーと myClass のベクトルを含むマップを作成しようとしています。

std::map<string,vector<myClass>> m;

ベクトルとマップを動的に設定する必要があります (ファイルから値を読み取ります)。

class myClass{
string dataMember1;
...
myClass()
     { ...  }
};

どのように進めればよいのでしょうか??

また、文字列キーに基づいてベクター内のオブジェクトにアクセスできるようにしたいと考えています。

例えば:

std::map<string,vConnect>::iterator pos;
pos = mapGraph.find(string);
cout<<(pos->second)[0]->DataMemberofmyClass

(pos->second)[0] は、ベクトルに格納された最初の myClass オブジェクトを示しますか??

ありがとう

4

2 に答える 2

5

一般に、マップされた型がコンテナーの場合、[] どこでも使用するだけでうまく機能します。エントリが存在しない場合は、空のコンテナーで作成されるため、次のようになります。

m[key].push_back( newElement );

また

m[key].begin(), m[key].end()

あるいは:

if ( !m[key].empty() )
    doSomethingWith( m[key].second[0] );

正しく動作します。同じ要素に対して多数の操作を行っている場合 (最後の 2 つのケースのように)、それを参照に保持したい場合があります。

std::vector<MyClass>& elem = m[key];
//  ...

唯一の例外は、要素を変更していない場合で、エントリが空の場合はエントリを作成したくない場合です。そのような場合、findとテストが必要になります:

std::map<std::string, std::vector<MyClass>>::const_iterator
                entry = m.find( key );
if ( entry != m.end() ) {
    std::vector<MyClass>& elem = entry->second;
    //  ...
}
于 2013-02-08T14:38:10.597 に答える
2

このようなネストされた型の操作は、単純なマップまたはベクターの操作と大差ありません。したがって、マップの要素はベクトルです。この要素を取得し、ベクターとして使用します。

pos = mapGraph.find(string);

マップ内の反復子を返します。

(pos->second)

この反復子の値であるベクトルです。したがって、a を使用する場合と同じように使用してくださいvector。要素が実際に見つかったかどうかを確認しないという事実を除けば、コードは正しいです。

std::map<string,vConnect>::iterator pos;
pos = mapGraph.find(string);
if (pos != mapGraph.end()) {
 cout<<(pos->second)[0].DataMemberofmyClass
}

編集(us2012に感謝): 実際、小さな間違い(pos->second)[0]がありました のオブジェクトであるため、を使用せずMyClassにメンバーにアクセスします。.->

于 2013-02-08T14:07:10.620 に答える