맵을 통한 C ++ 루프


216

map<string, int>string-int 값이나 키를 몰라도 각 요소를 반복하고 싶습니다 .

내가 지금까지 무엇을 :

void output(map<string, int> table)
{
       map<string, int>::iterator it;
       for (it = table.begin(); it != table.end(); it++)
       {
            //How do I access each element?  
       }
}

답변:


491

다음과 같이 이것을 달성 할 수 있습니다 :

map<string, int>::iterator it;

for ( it = symbolTable.begin(); it != symbolTable.end(); it++ )
{
    std::cout << it->first  // string (key)
              << ':'
              << it->second   // string's value 
              << std::endl ;
}

함께 C ++ 11 (및 이후) ,

for (auto const& x : symbolTable)
{
    std::cout << x.first  // string (key)
              << ':' 
              << x.second // string's value 
              << std::endl ;
}

함께 C ++ 17 (및 이후) ,

for( auto const& [key, val] : symbolTable )
{
    std::cout << key         // string (key)
              << ':'  
              << val        // string's value
              << std::endl ;
}

7
"it"앞에 "auto"유형을 추가하십시오
iedoc

2
@ P0W 왜 C ++ 11에서는 "auto const &"이지만 C ++ 17에서는 "const auto &"입니까? "auto const &"와 "const auto &"의 차이점은 무엇입니까?
Eric

35
차이는 없습니다. 맛의 문제 일뿐입니다. 그러나 @ P0W의 맛은 그다지 일관성이없는 것 같습니다 ...
Kapichu

15
C ++ 17로 업데이트 해 주셔서 감사 auto const& [key, val] : symbolTable합니다. 포맷 을 찾고있었습니다 !

3
@haram 프로젝트 설정 (구성 속성> C / C ++> 언어> C ++ 언어 표준)에서 "ISO C ++ 17 표준 (/ std : c ++ 17)"을 설정해야 할 수도 있습니다.
Swordfish

27

다음을 시도하십시오

for ( const auto &p : table )
{
   std::cout << p.first << '\t' << p.second << std::endl;
} 

일반 for 루프를 사용하여 동일하게 작성할 수 있습니다.

for ( auto it = table.begin(); it != table.end(); ++it  )
{
   std::cout << it->first << '\t' << it->second << std::endl;
} 

value_type std::map이 다음과 같이 정의 된다는 점을 고려하십시오.

typedef pair<const Key, T> value_type

따라서 내 예제에서 p는 key_ std::string, T는 value_type에 대한 const 참조int

또한 함수가 다음과 같이 선언되면 더 좋습니다.

void output( const map<string, int> &table );

14

value_type(A)의은 mapA가 pair그것의 키와 값을 포함 first하고 second부재 각각을.

map<string, int>::iterator it;
for (it = symbolTable.begin(); it != symbolTable.end(); it++)
{
    std::cout << it->first << ' ' << it->second << '\n';
}

또는 C ++ 11의 경우 다음을 위해 범위 기반을 사용합니다.

for (auto const& p : symbolTable)
{
    std::cout << p.first << ' ' << p.second << '\n';
}

7

모스크바의 @ 블라드 (Vlad) 는 다음과 같이 정의 된다는 점 value_type을 고려하십시오 std::map.

typedef pair<const Key, T> value_type

즉, 키워드 auto를보다 명시적인 유형 지정자 로 바꾸려면 다음과 같이 할 수 있습니다.

for ( const pair<const string, int> &p : table ) {
   std::cout << p.first << '\t' << p.second << std::endl;
} 

auto이 경우에 무엇 을 번역 할지 이해하기 위해 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.