[완료]STL MAP에서 find와 count에 대해서 질문있어염~^^

mosad34의 이미지

안녕하세요~

다름이 아니고 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천개의 정보가 담겨있다고 하고요..
고수분님들의 의견을 한번 듣고싶네요..

imyejin의 이미지

현재의 C++ 표준라이브러리에 대해서는 사용하지 않는 용어입니다.

그리고 Find라는 대문자로 시작하는 멤버함수는 처음 보는데 어떤 라이브러리를 사용하고 계신지도 좀 이상하네요.

그리고 map 은 템플릿 클래스 이름인데 변수 이름으로 또 map 을 사용하는 것도 그다지 좋지 않아 보입니다. (컴파일이 되긴 되나요?)

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

winner의 이미지

algorithm, container, iterator를 활용하는 방식은 통합적으로 이루어지고 있고,
비록 표준에서 정의되지 않는 용어라고 해도 아직 사라진 용어라고 보기에는 어려운 것 같아요.
새 표준에서는 functor가 STL 방식에서 좀더 일반화 되고, iterator도 활용폭이 약간 좁아지겠지만
algorithm과 container가 바뀌지 않는 이상 STL이라는 용어는 계속 사용될 것 같습니다.

mosad34의 이미지

흠..위에껀 제가 수정하도록 할께요 ...실수했네요..그냥 예시로 할려고 한건데 좀더 명확하게 수정해놓도록할게요

imyejin의 이미지

존재여부만 따지는 것이라면 find를 쓰는 게 맞습니다. 효율도 당연히 find가 낫겠죠.

죽는다면 죽는 이유는 그게 아니라 find를 써서가 다른 걸겁니다.

그런데 반환자라는 용어는 무엇을 번역한 것입니까? 처음 들어보는 용어라서요.

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

mosad34의 이미지

네..반환자는 제가 책에서 본거 같은데 iterator을 반환자라고 표기하더군요..;;
음..지금 제가 시간한번 재볼려고 아래처럼 간단하게 테스트 해봤거든요

	int cou =0;
        int start_time =0;
	int end_time =0;
	int Total_time =0;
        map<int,int>::iterator it;	
 
        for(int i=0;i<100000;i++) // map에 정보 저장
	{
          info[i]=i;
	  Sleep(1);
	}
 
	start_time = GetTickCount();
	it = info.find(99999);
	 //cou =info.count(99999);
        end_time = GetTickCount();
	printf("end_time: %d\n",end_time);
	Total_time = start_time - end_time;
	printf("걸린시간: %d\n",Total_time);

처음엔 it = info.find(99999)로
다음엔 cou =info.count(99999)로
했는데 수행시간에서는 차이가 없네요..
제가 테스트를 잘못한건가요?
이렇게 보면 단순히 있고없네를 찾는 부분에서는 효율성 차이가 많이나는건 아니죠??
고수님들 어떻게 생각하시나요?
winner의 이미지

말씀하신대로 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 해도 괜찮을 듯 합니다.

imyejin의 이미지

"반복자"라고 옮기는 것은 봤는데 반환자는 진짜 처음 들어봅니다. 구체적으로 어느 출판사의 누가 번역한 무슨 책에서 그렇게 옮기고 있는지 알려 주시면 대단히 감사하겠습니다. 그분께 왜 번역을 그렇게 했는지 좀 물어봐야겠습니다. -_-

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

[예진아씨 피카사 웹앨범] 임예진 팬클럽 ♡예진아씨♡ http://cafe.daum.net/imyejin

mosad34의 이미지

제가 착각한거 같네요..ㅠㅠ 정정 합니다 반환자(X), 반복자(0) 입니다..
성의 있는 답변에 감사드리며 좋은 하루 보내시길 바라겠습니다^^

제 글에 답변달아주신 고수님들 정말 감사합니다. 모두들 좋은 하루 보내시길...^.^

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.