2010-12-14 3 views
54

벡터 맵 또는 세트 맵을 만들 수있는 이유는 무엇입니까? 나를 위해 단지 차이점은 다음과 같습니다벡터의 맵에 비해 멀티 맵의 장점은 무엇입니까?

  • 우리가 단순히 [] 연산자를 사용하여 요소의 벡터가 핵심 요소를 얻기과 벡터 맵과 multimap에 equal_range를 사용하여.
  • 요소를 추가하기위한 다중 맵에서 multimap.insert(make_pair(key,value))을 사용하고 벡터 맵에서 map_of_vectors[key].push_back(value)을 사용합니다.

왜 멀티 맵을 사용해야합니까? 필자는 키의 모든 값을 얻으려면 두 개의 반복기를 사용하는 것이 좋습니다.

이 질문은 vector와 unordered_multimap의 unordered_map에도 적용됩니다.

+6

필자는'multimap'의 목적을 결코 이해하지 못했습니다./ –

+0

질문에 조금 늦었지만 멀티 맵은 여분의 포인터 때문에 벡터의 맵보다 훨씬 많은 메모리를 소비합니다.내가 사용하는 유일한 이유는 각 요소의 키를 유지하고자하는 경우이다. (푸시 백을하면 안된다.) – Jcao02

+0

다른 값의 중복 키를 추적하고 싶을뿐 아니라, 또한 순간 알림에서 키/값 쌍을 삭제하려고합니다. 벡터의지도는 적합하지 않으며 목록의지도를 사용할 수는 있지만 멀티 맵을 사용하는 것이 더 편리합니다. – richizy

답변

42

동일한 키를 가진 모든 값이 원하는 관계를 갖고 있는지 여부에 따라 달라집니다.

예를 들어, 자주 X 키를 사용하여 모든 요소를 ​​살펴 보거나 함수에 전달하는 등의 작업을 수행합니까? 그런 다음 별도의 컨테이너에 이미 가지고 있기 때문에 직접 처리 할 수 ​​있습니다.

그러나 항목의 컬렉션이 있어도 동일한 키 값을 공유하거나 공유하지 않는 이유는 무엇입니까? 반복자를 사용하여 다중 맵을 실행하는 것이지도, 벡터 케이스의 중첩 for 루프를 갖는 것보다 편리합니다.

또 다른 방법은 다음과 같습니다. 키당 여러 항목이 자주 사용되는 경우 맵, 벡터 케이스에서 구조가 더 효율적입니다. 드물게 일어난다면 그것은 반대입니다.

+2

감사합니다. 당신과 Artyom의 대답은 나에게 좀 더 많은 차이점을 보여주었습니다. 그러나 나는 아직도 멀티 맵이 벡터지도처럼 실제 생활에서 유용하다고 생각하지 않는다. 하지만 그건 내 개인 의견이다.) –

-1

2 개의 반복기 ??? 나는 네가 틀렸다고 생각해.

내가 멀티 맵에서 std :: for_each() 나 다른 알고리즘을 사용할 때 하나의 이터레이터 범위 만 사용하면 각 키에 대해 벡터를 걱정하는 것이 훨씬 간단합니다.

40

이, 당신은 당신이 그것을 제거 할 때까지 반복자는 유효 것을 알고 multimap<x, y> 사이에 당신이 multimap은에 값을 삽입 한 후 map<x, vector<y>>

많은 중요한 차이점은 이것은 당신이 할 수있는, 매우 강한 속성입니다 벡터의지도를 가지고 있습니다. 이지도에서 삭제 될 때까지

multimap<x,y>::iterator p=mymap.insert(make_pair(a,b)); 

반복자는 두 번째 경우, 에 매번 무효화 될 동안 벡터에 새 항목을 추가, 유효합니다.

또한 map<x, vector<y>>은 기존 키가 설정된 값이 비어있을 수 있지만 멀티 맵은 값이 설정되지 않을 수 있습니다.

이들은 서로 다른 동작을합니다.

솔직히 말해서 라이브러리에서 제공하지 않는 일부 언어로 멀티 맵을 놓친 것 같습니다.

관련 문제