std::map을 auto로 접근하는 방법?
조회수 10136회
std::vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7 };
for ( auto xyz : numbers )
{
std::cout << xyz << std::endl;
}
C++0x에는 vector
에서 for
문을 이렇게 돌면 xyz
는 int
형이었는데
std::map< foo, bar > testing = { /*...blah...*/ };
for ( auto abc : testing )
{
std::cout << abc << std::endl; // foo? bar?
std::cout << abc->first << std::endl; // 아니면 이터레이터?
}
이렇게 map
인 경우는 어떻게 되나요?
vector
같은 건 인덱스로 접근하는 것 같이 for
문을 돌아서 원소로 접근되고,
list
같은 건 이터레이터로 접근해야 하는데
map
이나 multimap
은 어떻게 접근해야 되나요?
1 답변
-
std::vector<X>
라고 선언하는 것은 container에X
타입의 원소를 저장하겠다는 의미고,std::map<X, Y>
라고 선언하는 것은std::pair<const X, Y>
를 저장하겠다는 의미입니다.std::pair<const X, Y>
에서X
에만const
가 붙는 이유는X
가key
이고,Y
가key
에 대응하는value
이기 때문입니다.key
는 바뀔 수 없지만, Y는 바뀔 수 있으니까요.이처럼
map
에 저장된 원소는std::map<K, V>::value_type
입니다. 따라서for(auto..)
와 같이 이터레이터를 쓸 때에는std::pair
에 접근하는 것입니다.std::pair
로<K, V>
를 접근할 때는pair
의 원소인first
(K
에 접근),second
(V
에 접근)을 써야 합니다.int main(){ map<int, int> temp; temp[5] = 4; temp[1] = 2; for(auto &kv : temp){ cout << kv.first << " " << kv.second << endl; } }
댓글 입력