0

マップの2番目のマップを反復処理する際に問題が発生しました。

#include <map>

using namespace std;

map<string, map<string, string> > mymap;
map<string, map<string, string> >::iterator itm;
pair<map<string, map<string, string> >::iterator,bool> retm;

for( itm=mymap.begin(); itm!=mymap.end(); ++itm)
{
cout << "first:\t" << it->first << endl;
}

2番目のマップを反復処理して、1番目と2番目の両方のキー/値を取得するにはどうすればよいですか?

2番目の質問は、マップに付属の「挿入」機能を使用して、1番目と2番目のマップに「挿入」するにはどうすればよいですか。

私は誰かが完全な答えを持っていることを望みます。

4

5 に答える 5

4

it->second「2番目のマップ」が表示されます。それを繰り返すだけです。

于 2012-09-26T11:41:45.830 に答える
3
#include <map>
#include <iostream>
using namespace std;

map<string, map<string, string> > mymap;
map<string, map<string, string> >::iterator itm;
pair<map<string, map<string, string> >::iterator,bool> retm;

int main() {

  /* populate: */
  mymap.insert(make_pair ("something", map<string, string>()));
  mymap["something"].insert(make_pair ("2", "two"));

  /* traverse: */
  for( itm=mymap.begin(); itm!=mymap.end(); ++itm)
  {
    cout << "first:\t" << itm->first << endl;

    for (map<string, string>::iterator inner_it = (*itm).second.begin();
        inner_it != (*itm).second.end(); 
        inner_it++) {
      cout << (*inner_it).first << " => " << (*inner_it).second << endl;
    }   

  }

  return 0;
}
于 2012-09-26T11:41:06.047 に答える
2

mymap を反復処理したのと同じように、it->second を反復処理するには、追加のネストされた for ループに 2 番目の反復子が必要です。

于 2012-09-26T11:42:03.200 に答える
2

このような:

typedef std::map<std::string, std::map<std::string, std::string>>::iterator outer_it;
typedef std::map<std::string, std::string>::iterator                        inner_it;

for (outer_it it1 = mymap.begin(); it1 != mymap.end(); ++it1)
{
    for (inner_it it2 = it1->second.begin(); it2 != it1->second.end(); ++it2)
    {
        std::cout << "first: " << it1->first << ", second: " << it2->first
                  << ", value: " << it2->second << std::endl;
    }
}

挿入するには:

mymap["hello"]["world"] = "foo";

または、次を使用しinsertます。

mymap["hello"].insert(std::make_pair("world", "foo"));

複数の値を挿入する場合は、外部ルックアップを 1 回だけ実行します。

std::map<std::string, std::string> & m = mymap["hello"];
m.insert(std::make_pair("world", "foo"));
m.insert(std::make_pair("word",  "boo"));
m.insert(std::make_pair("lord",  "coo"));
于 2012-09-26T11:42:03.870 に答える
1

C++11 では、次のようにできます。

for (const auto& outerElem: mymap) {
    cout << "First: " << outerElem.first << endl;
    for (const auto& innerElem: outerElem.second) {
        cout << "  First: " << innerElem.first << endl;
        cout << "  Second: " << innerElem.second << endl;
    }
}

C++03 では、BOOST_FOREACHでこれを行うこともできます。とはいえ使えないautoので、このように型ごとにtypedefするのがベストです。とにかく、このように typedef を使用することは良い考えです。

typedef map<string, string> innerMap;
typedef map<string, innerMap> outerMap;
于 2012-09-26T12:23:52.837 に答える