C ++지도 맵을 어떻게 반복 할 수 있습니까? 루프를 어떻게 반복 할 수 있습니까? 내지도는

std::mapC ++에서 루프를 어떻게 반복 할 수 있습니까? 내지도는 다음과 같이 정의됩니다.

std::map< std::string, std::map<std::string, std::string> >

예를 들어 위 컨테이너에는 다음과 같은 데이터가 들어 있습니다.

m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";

이 맵을 반복하고 다양한 값에 액세스하려면 어떻게해야합니까?



답변

오래된 질문이지만 나머지 답변은 C ++ 11부터 구식입니다. 원격 기반 for 루프를 사용 하고 간단하게 수행 할 수 있습니다.

std::map<std::string, std::map<std::string, std::string>> mymap;

for(auto const &ent1 : mymap) {
  // ent1.first is the first key
  for(auto const &ent2 : ent1.second) {
    // ent2.first is the second key
    // ent2.second is the data
  }
}

이전 버전보다 훨씬 깨끗해야하며 불필요한 사본을 피해야합니다.

주석을 참조 변수의 명시 적 정의로 바꾸는 것이 좋습니다 (사용하지 않으면 최적화됩니다).

for(auto const &ent1 : mymap) {
  auto const &outer_key = ent1.first;
  auto const &inner_map = ent1.second;
  for(auto const &ent2 : inner_map) {
    auto const &inner_key   = ent2.first;
    auto const &inner_value = ent2.second;
  }
}

답변

반복자를 사용할 수 있습니다.

typedef std::map<std::string, std::map<std::string, std::string>>::iterator it_type;
for(it_type iterator = m.begin(); iterator != m.end(); iterator++) {
    // iterator->first = key
    // iterator->second = value
    // Repeat if you also want to iterate through the second map.
}

답변

for(std::map<std::string, std::map<std::string, std::string> >::iterator outer_iter=map.begin(); outer_iter!=map.end(); ++outer_iter) {
    for(std::map<std::string, std::string>::iterator inner_iter=outer_iter->second.begin(); inner_iter!=outer_iter->second.end(); ++inner_iter) {
        std::cout << inner_iter->second << std::endl;
    }
}

또는 C ++ 0x에서 더 좋습니다 :

for(auto outer_iter=map.begin(); outer_iter!=map.end(); ++outer_iter) {
    for(auto inner_iter=outer_iter->second.begin(); inner_iter!=outer_iter->second.end(); ++inner_iter) {
        std::cout << inner_iter->second << std::endl;
    }
}

답변

C ++ 17 이상에서는 “구조적 바인딩”기능을 사용하여 단일 튜플 / 쌍을 사용하여 다른 이름으로 여러 변수를 정의 할 수 있습니다. 예:

for (const auto& [name, description] : planet_descriptions) {
    std::cout << "Planet " << name << ":\n" << description << "\n\n";
}

원래의 제안 (유명 비얀 스트로브 스트 룹, 허브 셔터와 가브리엘 도스 헤이스에 의해)은 재미 읽는 것입니다 (와 제안 된 구문은 이럴 더 직관적이다); 또한 표준에 대한 제안 은 지루하지만 실제로 들어갈 내용에 더 가깝습니다.


답변

다음과 같이하십시오 :

typedef std::map<std::string, std::string> InnerMap;
typedef std::map<std::string, InnerMap> OuterMap;

Outermap mm;

...//set the initial values

for (OuterMap::iterator i = mm.begin(); i != mm.end(); ++i) {
    InnerMap &im = i->second;
    for (InnerMap::iterator ii = im.begin(); ii != im.end(); ++ii) {
        std::cout << "map["
                  << i->first
                  << "]["
                  << ii->first
                  << "] ="
                  << ii->second
                  << '\n';
    }
}   

답변

C ++ 11 :

std::map< std::string, std::map<std::string, std::string> > m;
m["name1"]["value1"] = "data1";
m["name1"]["value2"] = "data2";
m["name2"]["value1"] = "data1";
m["name2"]["value2"] = "data2";
m["name3"]["value1"] = "data1";
m["name3"]["value2"] = "data2";

for (auto i : m)
    for (auto j : i.second)
        cout << i.first.c_str() << ":" << j.first.c_str() << ":" << j.second.c_str() << endl;

산출:

name1:value1:data1
name1:value2:data2
name2:value1:data1
name2:value2:data2
name3:value1:data1
name3:value2:data2

답변

std::map< std::string, std::map<std::string, std::string> >::const_iteratormap이 const 일 때 사용합니다 .