2009-07-22 5 views

답변

17
  1. 이지도 작업을 수행하지만, (std::pair<const map::key_type, map::mapped_type> 인)을 map::value_type와 비교하지 키 입력이 필요합니다.
  2. map.find는 키를 가져와 키/값 쌍 반복자를 반환하기 때문에.
+1

지도의'value_type_은'pair '입니다. –

+2

표준 섹션 23.3.1에 따르면 std :: map 에 대해 key_type은 Key이지만 value_type은 pair 입니다. 그 이유는 일단 값이 삽입되면 삽입 키는 변경 불가능해야하며, 그렇지 않으면 순서 불변성이 깨질 수 있습니다. –

3

다른 곳에서 언급했듯이 유형은 키/값 쌍이므로 비교를 수행하기 위해 함수/함수를 제공해야합니다. (사용자 정의 연산자 ==() 오버로드도 할 수 있습니다. 그런 일은 한번도 시도한 적이 없습니다.)

지도 멤버 함수 find()를 사용하고 싶지는 않을 것입니다. O (logN) 룩업, 알고리듬 std :: find()는 O (N)이다.

추가 :지도를 사용하여 std :: equal_range/lower_bound/upper_bound()를 사용할 수도 있다고 생각합니다.이 또한 O (LogN)입니다.

+0

사용자 지정 연산자 ==는 허용되거나 필요하지 않습니다. find_if innstead를 사용하십시오. – MSalters

+0

당신 말이 맞아요. –

1

동일 범위를 의미합니까? 맵을 사용하면 lower_bound, upper_bound 및 equal_range 멤버 함수를 사용해야합니다. 표준 등가물은 로그의 비교 수를 제공 할 수 있지만 컨테이너의 요소를 걷는 데 선형 시간이 필요합니다.

+0

선형 보행에 대한 확신이 있습니까? 랜덤 억세스 이터레이터가 있다면 로그 워크를 얻으실 수 있다고 생각했습니다. –

+0

임의 액세스 반복기가있는 경우 그렇습니다. 그렇지 않은 경우 선형 단계 수를 수행해야합니다. std :: map은 무작위 액세스 반복자를 제공하지 않습니다. – navigator

+0

네, 그 지점에서 꽤 옳습니다.지도의 반복자는 양방향입니다. –

1

이러한 주제에 대한 자세한 내용은 Scott Meyers의 "Effective STL"을 읽어야합니다.

: 멤버 함수가 존재하는 이유를 들어

왜 당신이 그것을 사용해야합니다 "항목 (43)는 같은 이름을 가진 알고리즘 멤버 함수를 선호".

0

Scott Meyers는 자신 만의 루프를 작성하는 것과는 대조적으로 STL 알고리즘을 사용하는 것을 권장합니다 (2001 년 판 43 항). 단순한 유형의 경우에는 그냥 사용할 수 있어야합니다.

find(mmap.begin(), mmap.end(), "value") 
관련 문제