2011-09-08 4 views
12

더 효율적인지 궁금합니다.멀티 맵 대 세트가있는지도

std::map< String, std::set<int> > 

또는

std::multimap< String, int > 

편집 : 나는이지도와 일상에서 어떤 일을하지 않을 . 표준 삽입, 삭제, 수정, 검색. 각 세트 또는 다중 키 문자열의 크기는 100을 넘지 않아야합니다.

+4

"효율적"을 정의하십시오. –

+1

수행 할 작업은 무엇입니까?첫 번째 방법은 문자열과 정수로 빠른 검색을 수행 할 수 있고 두 번째 방법은 문자열이 동일한 각 값에 대해 int 부분을 반복하고 테스트해야합니다. 만약 당신이 그 작업을 필요로하지 않는다면, 두 번째 옵션이 몇몇 유스 케이스에서 더 나은 경우가있을 수 있습니다 ... –

+0

제 편집 –

답변

9

이 구현 의존하지만, (UN) 추측이 : 실제로

당신이 multimap 또는 std::set에 유지됩니다 정수의 수에 따라 달라집니다. multimap은 키를 log (n) 검색 한 후 값을 선형 검색 할 가능성이 높습니다. 정수 값이 많은 경우 키를 log (n) 검색 한 다음 값을 log (n) 검색하면 약간 더 빠를 수 있습니다.

그러나, string 키로 map 또는 multimap 아무것도 저장 효율성의 측면에서 거의 확실하게 두 경우의 차이를보다 중요한 것입니다.

아래와 같이 multimap은 사용하기가 쉽고 유지 관리가 더 명확하여 명확한 이점을 제공합니다.

1

확실히 말할 수는 없지만 멀티 맵이 다른 하나의 표현을 수행하도록 설계 되었다면 더 좋을 것입니다. 멀티 맵을 사용하고 멀티 맵을 사용하면 훨씬 이해하기 쉬우 며 멀티 맵을 개념으로 사용하기위한 멤버 함수를 가지고 있기 때문에 다른 접근법을 사용하면 약간의 펑키 함수가 될 것입니다. 내가 믿는

1

std :: multimap < String, int>은 메모리 효율성이 가장 높습니다.

+4

이유가 있습니까? –

+0

저장된 숫자의 숫자는 둘 다 동일하지만 두 개의 빨간색 검은 나무를 사용하기 때문에 필요한 것보다 두 배 많은 "서기 유지"구조가 사용됩니다. 또한 std :: string STL 구현의 대부분은 참조 카운팅 및 쓰기 의미에 대한 복사를 사용하므로 문자열에 사용 된 데이터가 두 배로되지 않을 수 있습니다. 희망이 내 전화에 입력이 의미가 있습니다. –

+1

사실, 맵과 세트가 멀티 맵 (multimap의 _additional_ 부기는 무엇입니까?)보다 많은 공간을 차지한다는 사실을 증명하지 못했지만 실제로는 두 개 이상의 나무를 저장하게 될 것입니다. 그리고 이것들은 나무가 지정되지 않았기 때문에 구현됩니다. 그리고 STL에는'std' 네임 스페이스가 없습니다. 그리고, 정말로, 내 의견은 _answer_에 대한 근거를 추가하도록 유도하려는 의도였습니다.) –

1

지금까지 (당신이 아니라는 것을 말하고 있지 않다) 그 답변에 만족하지 않은 경우와 나는 절대적으로 대답을 강요하고, 내가주지 내 교육도 "추측"

이의를 삽입하려면 멀티 맵은보다 "효율적"인 것처럼 보입니다. 지도 접근 방식을 사용하려면 먼저 집합을 검색 한 다음 연산을 수행해야합니다. 삭제/검색하려면 맵이 더 "효율적"인 것 같습니다.

4

"설정"옵션을 사용하면 멀티 맵에서 키 + 값 쌍 중복을 제거 할 수 있습니다.

0

어쨌든 실제로는 동일하지 않습니다. multimap<X,Y>은 중복 키 - 값 쌍을 저장할 수 있지만 map<T, set<X>>은 저장하지 않습니다. 당신은 키 - 값 쌍을 복제 할 필요가없는

multimap<int, int> m; 
m.insert(make_pair(2, 3)); 
m.insert(make_pair(2, 3)); // This changes the size of m! 

map<int, set<int>> m; 
m[2].insert(3); 
m[2].insert(3); // This does nothing. 

반면 그래서 설정 방법을 사용합니다. 문법도 더 좋습니다. 나는 성능과 메모리 사용의 차이가 그렇게 크지 않을 것이라고 기대한다.

관련 문제