iterator-> second는 무엇을 의미합니까?


157

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

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

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


14
A std::map값을 저장 합니다 . 값을map::iterator.second 나타냅니다 .
Alok Save

답변:


247

당신은 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.


4
왜 프로그래밍의 다른 모든 것처럼 [0]과 [1] ( "첫 번째"와 "두 번째")을 사용하지 않습니까?

21
때문에 @AdamCross operator[]특정 형식을 반환해야하지만, firstsecond다른 유형을 가질 수 있습니다. 반면, 색인으로 요소에 액세스하기위한 std::tuple특수 도우미 기능 std::get이 있습니다.
Joseph Mansfield

16

의 요소의 형태 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


5
"키"와 "값"이라는 단어는 순서를 의미하는 "첫 번째"와 "두 번째"보다 직관적 일 것입니다.
ahoffer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.