[완료]STL MAP에서 find와 count에 대해서 질문있어염~^^
글쓴이: mosad34 / 작성시간: 목, 2010/04/29 - 9:47오전
안녕하세요~
다름이 아니고 MAP에서 키값으로 Find함수 사용해서 원하는 값의 반환자를 사용해서 처리하고 있는데요
음..이게 좀 불안정한거 같습니다.
계속 문제가 발생하는건 아닌데 MAP에서 키값으로 계속적으로 Find함수써서 나온 반환자로 그게 끝인지(end함수 사용) 비교해서 키값이 존재하는지를 판별했는데요..
음 위에 방법이 아무래도 약간 불안한건지..가끔 프로그램이 죽을때가 있네요.'
그래서 아무래도 Find에서 이상한 위치를 반환해서 죽는거 같다는 생각이 들어서요.
형식이 아래와 같이 되어 있어요
map<xx,xx> info; std::map<xx,xx>::iterator it = info.find(xxx); if(it == info.end()) { printf("키값이 존재하지 않음\n"); } ... ... ...
아무래도 위와 같이 사용하는게 좀 맘에 걸려서 그러거든요
그래서 차라리 count함수로 키값을 넣어 원소값이 있는지(멀티맵은 아니므로 0 아니면 1이 나옵니다)를 확인해서 처리하는 방법을 사용할려고 하거든요
그렇게 되면 위와같이 Find나 end등도 사용하지 않아도 될거 같고요
과연 Find함수와 count함수로 둘이 퍼포먼스 차이가 많이 날까요??(속도차가 많이 날까요?)
map에는 대략적으로 한 2천~3천개의 정보가 담겨있다고 하고요..
고수분님들의 의견을 한번 듣고싶네요..
Forums:
STL이라는 용어는 이제 역사적으로 과거의 라이브러리를 가리킬 뿐
현재의 C++ 표준라이브러리에 대해서는 사용하지 않는 용어입니다.
그리고 Find라는 대문자로 시작하는 멤버함수는 처음 보는데 어떤 라이브러리를 사용하고 계신지도 좀 이상하네요.
그리고 map 은 템플릿 클래스 이름인데 변수 이름으로 또 map 을 사용하는 것도 그다지 좋지 않아 보입니다. (컴파일이 되긴 되나요?)
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
과거까지는 아닌 것 같은데...
algorithm, container, iterator를 활용하는 방식은 통합적으로 이루어지고 있고,
비록 표준에서 정의되지 않는 용어라고 해도 아직 사라진 용어라고 보기에는 어려운 것 같아요.
새 표준에서는 functor가 STL 방식에서 좀더 일반화 되고, iterator도 활용폭이 약간 좁아지겠지만
algorithm과 container가 바뀌지 않는 이상 STL이라는 용어는 계속 사용될 것 같습니다.
흠..위에껀 제가
흠..위에껀 제가 수정하도록 할께요 ...실수했네요..그냥 예시로 할려고 한건데 좀더 명확하게 수정해놓도록할게요
count 보다 find 를 쓰는 게 맞습니다
존재여부만 따지는 것이라면 find를 쓰는 게 맞습니다. 효율도 당연히 find가 낫겠죠.
죽는다면 죽는 이유는 그게 아니라 find를 써서가 다른 걸겁니다.
그런데 반환자라는 용어는 무엇을 번역한 것입니까? 처음 들어보는 용어라서요.
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
네..반환자는 제가
네..반환자는 제가 책에서 본거 같은데 iterator을 반환자라고 표기하더군요..;;
음..지금 제가 시간한번 재볼려고 아래처럼 간단하게 테스트 해봤거든요
처음엔 it = info.find(99999)로
다음엔 cou =info.count(99999)로
했는데 수행시간에서는 차이가 없네요..
제가 테스트를 잘못한건가요?
이렇게 보면 단순히 있고없네를 찾는 부분에서는 효율성 차이가 많이나는건 아니죠??
고수님들 어떻게 생각하시나요?
성능차는 1%도 나기 어렵습니다.
말씀하신대로 std::map::count 는 0 혹은 1을 반환하므로
보통 다음과 같이 정의됩니다.
return this->end() == this->find(k) ? 0 : 1;
대부분의 시간은 this->find(k)에서 소모되지요.
하지만 STL의 활용기법은 암묵적으로 원소가 있는지를 찾을 때
m.end() != m.find(k) 을 쓰는 것 같습니다.
왜냐하면 좀더 generic한 code를 작성하고자 할 때
multimap을 고려하게 될테고 multimap의 count는 find 보다
성능차가 날 가능성이 높으니까요.
제 생각에는 좀더 의미를 담고자 한다면 has 함수를 하나 만들어
m.end() != m.find(k)를 wrapping 해도 괜찮을 듯 합니다.
winner 님께서 내용은 잘 설명해 드렸고 반환자에 대해 다시 질문합니다
"반복자"라고 옮기는 것은 봤는데 반환자는 진짜 처음 들어봅니다. 구체적으로 어느 출판사의 누가 번역한 무슨 책에서 그렇게 옮기고 있는지 알려 주시면 대단히 감사하겠습니다. 그분께 왜 번역을 그렇게 했는지 좀 물어봐야겠습니다. -_-
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin
어헝헝..죄송하네요..제가 착각한듯 싶습니다...ㅠㅠ
제가 착각한거 같네요..ㅠㅠ 정정 합니다 반환자(X), 반복자(0) 입니다..
성의 있는 답변에 감사드리며 좋은 하루 보내시길 바라겠습니다^^
제 글에 답변달아주신 고수님들 정말 감사합니다. 모두들 좋은 하루 보내시길...^.^
댓글 달기