삽입하지 않고 std :: map에 키가 있는지 확인하는 방법은 무엇입니까?


답변:


305

사용 my_map.count( key ); 기본적으로 원하는 부울 결과 인 0 또는 1 만 반환 할 수 있습니다.

교대로 my_map.find( key ) != my_map.end()작동합니다.


40
@ 존 : 조기 최적화의 악취. GCC (그리고 가장 합리적인 시스템이라고 확신합니다)에서 map::count로 구현됩니다 find(__x) == end() ? 0 : 1;. 들어 multimap당신은 성능 인수가있을 수 있습니다,하지만 영업 이익의 문제가 아닙니다 그리고 난 아직도 우아함을 선호합니다.
Potatoswatter 2016 년

42
아니요, 조기 최적화 인수는 최적화에 약간의 노력이 필요한 경우에만 유효하며,이 경우에는 그렇지 않습니다.
markh44

13
사실이 아니다. 코드를 쉽게 읽을 수있게하거나 불필요한 오버 헤드를 제거하는 것은 시기상조가 아닙니다. 카운트 () () 어쨌든 찾기를 통해 구현되는 경우이 경우, 다음 직접 함수 호출을 제거 () 찾기를 호출 ... ERGO, 그건 성숙 최적화. find () 호출을 사용하는 것이 더 분명하다는 것을 알았습니다. 그러나 그것은 개인적으로 선호됩니다.
Tim Keating

9
라이브러리 함수를 사용하기 전에 라이브러리 함수의 성능을 인식하는 것은 조기 최적화가 아닙니다. 이 경우에는 옳습니다. 중요하지 않지만 찾기와 개수의 작은 문체 차이는 없습니다. 나는 당신이 '조기 최적화'수사를 너무 멀리 생각한다고 생각합니다. 일상적인 개발에 찾아서 사용할 수있는 "무료"최적화 습관을 사용해야합니다. 코더가 가독성 / 개발 시간 등으로 비용을 지불하는 함정에 빠졌을 때, 조기 최적화 수사법이 올바른 조언이되는 측정되지 않은 "성능 향상"을 위해 모든 것이 있습니다.
VoidStar

10
멀리, std는 지구상의 다른 모든 제정신 맵 클래스와 마찬가지로 망할 has(k)/ 추가해야합니다 contains(k). 인터페이스 디자인이 불량합니다. find () 접근 방식이 너무 장황하며 그 count(k)접근 방식이의 의미 론적 패리티가 아닙니다 has(k). 그 문제에 대해서도 마찬가지입니다 find(k). 이 질문에 대한 조회수를 확인하십시오.
Jarrod Smith

46

Potatoswatter의 대답은 괜찮지 만 대신 find또는 을 사용하는 것을 선호합니다 lower_bound. lower_bound동일한 키로 무언가를 삽입하려는 경우 반환 된 반복자가 힌트 삽입에 사용될 수 있기 때문에 특히 유용합니다.

map<K, V>::iterator iter(my_map.lower_bound(key));
if (iter == my_map.end() || key < iter->first) {    // not found
    // ...
    my_map.insert(iter, make_pair(key, value));     // hinted insertion
} else {
    // ... use iter->second here
}

이것은 그가하고있는 방식과 미묘하게 다르다… 유일한 차이점은 value삽입이 불필요하다면 계산을 건너 뛸 수 있다는 것이다.
Potatoswatter

1
물론 OP는 삽입에 신경 쓰지 않으므로 lower_bound기반 솔루션이 과도 하다는 것을 알고 있습니다. 나는 "완전성을위한"내 대답을 언급했습니다. 내가 말했듯이, 당신은 완벽하게 충분합니다. :-)
Chris Jester-Young

4
네, 이것은 좋은 대답이며 나는 동의하지 않습니다. insert선험 의 대안과의 관계를 지적하십시오 . 실제로,를 사용하는 경우 다른 방법 이 있습니다 multimap.이 lower_bound방법은 등가 범위의 시작 부분에 삽입하지만 일반 insert방법은 범위의 끝에 추가합니다.
Potatoswatter

2
질문에 대한 답변이 아니지만 잘못된 질문으로 올바른 답변을 얻을 수 있습니다 ... 삽입 / 업데이트를 수행해야합니다. : D
Hunter-Orionnoir

1
@Hunter 코드를 보여 주시겠습니까? 그것이 크지 않다면 아마 당신을 위해 그것을 검토 할 수 있습니다.
Chris Jester-Young

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