0

変更: コードをより読みやすくしました

最近、ネストされた STL マップに関する質問を投稿しましたが、コードを入れていないため、同じ質問を再度行います (今回はコードが含まれています)。どんな助けでも大歓迎です。スパム行為についてお詫び申し上げます。

私は過去 4 日間何かに行き詰まっており、今はガイダンスが必要です。

ここに私のデータ構造があります:

class demo1
{
    int a, b, c, d, e;
}

class demo2
{
    map(int, demo1) map1
}

map(string, demo2) map2;

vector< pair<int, demo1> > vec1;

ここで、2 つの文字列変数 (map2 の「キー」) と 3 つの int 変数 (map1 の「キー」) があるとします。map2 と map1 の間で正しいマッピングを確立するにはどうすればよいですか?

これが私が期待している出力です:

// Expected mapping output
string 1(key in map2)
int 1(key in map1) -> demo1
int2               -> demo1
int 3              -> demo1
string 2
int 1(key in map1) -> demo1
int2               -> demo1
int 3              -> demo1

コードの関連部分は次のとおりです (上記のデータ構造はヘッダー ファイルにあり、ここに私が使用するメインの .cpp ファイルがあります。実際のコードは非常に長く、関連部分のみを挿入しています)

class tmp1
{
    int a, b, c, d e;
} t1;

....

if(condition is true)
{
    string tmp_string // this string is a key in map2
    map2.insert(make_pair(tmp_string, demo2));
}

if(another condition is true)
{
    int n; // this is a "key" in map1
    demo 1 d1 // create an instance of class demo1
    d1.a =  t1.a;
    d1.b =  t1.b;
    d1.c =   t1.c;
    d1. d =   t1.e;
    d1.f  = t1.f;
    // Insert these value into map now
    map1.insert(make_pair(n, d1));
    vec1.push_back(make_pair(n, d1));  // vec1 is define above in the data structure section
}

これが私が出力をチェックする方法です

map(string, demo2)::iterator outer_itr;
map(int, demo1)::iterator inner_itr;

for(outer_itr = map2.begin(); outer_itr != map2.end(); outer_itr++)
{
    cout << "String is " << (*outer_itr).first << endl;
    vector < pair<int, demo1> >::iterator itr;
    for(itr = vec1.begin(); itr != vec1.end(); itr++)
    {
        cout << "Int key in map1 is " << (*itr).first           << endl;
        cout << "Value of a is      " << (*itr).second.second.a << endl;
        cout << "Value of b is      " << (*itr).second.second.b << endl;
        cout << "Value of c is      " << (*itr).second.second.c << endl;
    }
}

これはマッピングを行う正しい方法ですか..?

4

1 に答える 1

0

読んだ後、コードは単に demo2 をマップとして使用していると思いvec1ます.@Leeorが述べたように、マップ機能を複製していますが、これは実際にはdemo2. したがって、最終的な解決策は と を排除する必要がvec1ありdemo2ます。

これを実現するには、次の 2 つの方法があります。

に直接インデックスを作成できるようにしたい場合demo1は、コードで行うことになるのでmap2["string 1"].map1[1]、キーを統合する必要があります

  • したがって、コンテナは次のようになります。std::map< std::pair< std::string, int >, demo1 > map2
  • インデックス付けは次のようになります: map2[std::make_pair("string 1", 1)]

「string 1」にアタッチされたすべての値を反復できるようにしたい場合、コードが for ブロックで実行しているように見える場合は、マルチマップを使用する必要があります

  • したがって、コンテナは次のようになります。std::multimap< std::string, std::pair< int, demo1 > > map2
  • 挿入すると次のようになります。map2.insert( std::make_pair( 1, myDemo1 )
  • 次のように、 が開始イテレータでが終了イテレータである astd::pairのイテレータを取得します。firstsecondauto itr = map2.equal_range( "string 1" )

上記の機能の両方が必要な場合は、@jrok で言及されているネストされたマップが必要です

于 2013-09-26T13:26:00.700 に答える