2011-09-08 2 views
0

나는 multimap <int key, int value>을 가질지 또는 int 키에 해당하는 모든 값의 벡터를 포함하는 벡터를 유지할 것인지에 대한 딜레마가 있습니다.벡터 또는 멀티 맵 딜레마

특정 int 키의 값을 조회 할 때 더 빨리 수행하는 것에 관심이 있습니다.

+3

도메인의 일부 일반 데이터로 결과를 확인하고 프로필을 모두 시도 했습니까? – Mankarse

+0

필자는 최근에야 프로파일 링 도구 인 AMD CodeAnalyst를 사용하려고 시도했지만 아직까지는 그다지 숙달되지 않았습니다. 미안하지만, 나는이 세상에서 새로운 사람이야. :/ – vedran

답변

4

당신은 multimap 단지 map이 대안은 아마 될 것입니다하지 그런 vector< list<int> > 또는 무언가를 원하는 경우에 (실제로는 multimap 더이거나 적은 list 요소 유형의 map). 일반적으로

가하는 vector 조회가 빠르다 : 그것은 두 경우에 나는 list/vector/set로 검색을 계산하고 있지 않다 (지도에 대한 O(log n) 대 배열 O(1)있어 /은 "멀티"에 사용되는 어떤 부품). 그러나을 사용하려면 vector을 사용하려면 가장 큰 int 키만큼 커야합니다. 키가 순차적이라면 문제가되지 않지만 색인이 희박한 경우 multimap을 선택하는 것이 좋습니다.

반면에 순회가 필요하지 않은 경우 unordered_multimap (실제로 해시 테이블 임)은 두 세계 모두에서 최상일 수 있습니다. 배열과 같은 O(1) 조회는 엄청난 빈 배열을 유지하지 않고도 얻을 수 있습니다. .

1

난 당신이 모든 값을 가진 벡터를지도에서 검색을 수행 한 번 때문에 map<int, vector<int>>

를 추천 할 것입니다.

그렇지 않으면 솔루션은 각각의 값

+2

'multimap'은'equal_range' 함수를 가지고 있으므로 각 값에 대해 새로운 검색을 할 필요가 없습니다. – Mankarse

+0

이것은 사실이 아닙니다. 일반적인 구현은 트리 구조이므로 '동등 범위'함수는 주어진 시작 지점에서 트리를 횡단합니다. –

+0

@EdHeal : 주어진 시작 지점에서 나무를 가로 지르는 것이 잘못된 이유는 무엇입니까? 벡터를 반복하는 것보다 속도가 느린 경우에는 너무 적습니다. –

1

난 당신이 조기 최적화를하고있는 생각의 새로운 검색이 필요합니다. 모든 것이 프로파일 러를 사용하여 작업 한 후에 만 ​​최적화해야하기 때문에 좋지 않습니다. 시간을 낭비하지 말고 필요에 따라 전문 용기를 사용하십시오.

+2

어느 정도까지, 확실히.프로파일 링을 너무 늦게 두지는 않더라도 잘못된 컨테이너를 선택하고 코드가 컨테이너로 모듈화되지 않으면 쉽게 나중에 악몽을 바꾸게됩니다. 당신은 직업에 맞는 컨테이너를 고르고, "속도"(실제로 복잡성 증가)를 생각할 때, 직업에 맞는 컨테이너가 무엇인지 깨닫는데 도움이 될 수 있습니다. –

+0

허브 셔터 (Herb Sutter)는 101 개의 조언에 대해 이렇게 적었습니다. 코드는 추상화를 기반으로해야하지만 컨테이너와 같은 세부 정보는 기반으로하지 않아야합니다. 그래서 미래의 리팩토링에서는 구체 컨테이너 – Camelot

+0

을 변경하는 것이 바람직하지 않을 것입니다. 코드의 특정 유형이 아닐지라도 선택한 데이터 모델은 이러한 추상화의 일부입니다. –

2

만약 당신의 키가 순차적으로 벡터와 함께 움직인다 고 말할 수는 있지만 키에 큰 구멍이 있다면 벡터가 더 좋을 것입니다 (벡터 에서처럼 "빈"레코드를 저장할 필요가 없기 때문에) 더하기 등 당신이 얼마나 많은 레코드를 계산하기가 더 쉽게됩니다. 성능 현명한 벡터는 배열을 기반으로하므로 조회는 일반적으로 더 빠릅니다 (조회는 조회를 수행하기 위해 몇 개의 데이터 조각을 거쳐야하므로).

4

'빠름'을 잊어 버립니다. 당신은 나중에 그것을 프로파일 링 할 수 있지만 이것에 사로 잡히지 마십시오. 훨씬 더 중요한 것은 하나의 접근 방식이 당신에게 희소 한 스토리지를 제공하고, 다른 하나는이 문제에 집중하지 않고 어떤 것이 당신의 문제에 가장 적합한 지 결정하는 것입니다.