iterator-> second는 무엇을 의미합니까? operator ->되어 a를 반환 하고

C ++에서 std::map<>::iterator? 의 유형은 무엇 입니까?

우리 it는 타입 의 객체 가 std::map<A,B>::iterator오버로드 operator ->되어 a를 반환 하고 a 및 멤버 가 std::pair<A,B>*있음을 알고 있습니다.std::pair<>firstsecond

그러나이 두 멤버는 무엇에 해당하며 왜 맵에 저장된 값에 액세스해야 it->second합니까?



답변

당신은 std::vector<X>상점이 많은 X물건 들을 저장 한다는 것을 알고 있습니까? 그러나을 가지고 있다면 std::map<X, Y>실제로 저장하는 것은 전체입니다 std::pair<const X, Y>. 이것이 바로지도가되는 것입니다. 키와 관련 값이 쌍을 이룹니다.

를 반복 std::map하면이 모든 것을 반복 std::pair합니다. 이러한 반복자 중 하나를 역 참조 std::pair하면 키와 관련 값 이 포함 된 을 얻게 됩니다.

std::map<std::string, int> m = /* fill it */;
auto it = m.begin();

여기서을 수행 하면지도의 첫 번째 요소에 *it대한를 얻게 std::pair됩니다.

이제이 유형을 std::pair사용하면 두 멤버를 통해 요소에 액세스 할 수 있습니다 : firstsecond. 당신이 경우 그래서 std::pair<X, Y>라고 p, p.firstX객체와 p.secondA는 Y객체입니다.

그래서 지금 당신이 역 참조 알고 std::map반복자 것은 당신에게를 제공합니다 std::pair, 당신은 다음과 요소에 액세스 할 수 있습니다 firstsecond. 예를 들어 (*it).first(*it).second를 제공하고 가치를 제공합니다. 이것들은 it->firstand와 동일합니다 it->second.


답변

의 요소의 형태 std::map열쇠 (해당지도 반복자 역 참조하여 얻어진 식의 유형) K및 값 V이고 std::pair<const K, V>키가 – const맵 값의 내부 정렬 간섭을 방지 할 수있다.

std::pair<>두 개의 멤버가 first있고 second( 여기 참조 ) 매우 직관적 인 의미가 있습니다. 따라서 i특정 맵에 반복자 가 주어지면 다음 과 같은 표현식이 나타납니다.

i->first

다음과 같습니다.

(*i).first

반복자가 가리키는 객체 의 첫 번째 ( const) 요소를 나타냅니다. pair즉 , 맵 의 를 나타냅니다 . 대신에 표현은 다음과 같습니다.

i->second

다음과 같습니다.

(*i).second

즉 ,지도 의 해당 을 나타내는 두 번째 요소를 나타냅니다 .pair