2009-08-20 4 views

답변

5

multimap<int,int>의 값 유형은 pair<int,int>입니다. 정확하게 벡터를 유지하고 싶습니다.

v.resize(mmap.size()); 
std::copy(mmap.begin(), mmap.end(), v.begin()); 

당신은 또한 사용할 수 있습니다 : 기존 벡터가있을 경우이 요소를 복사 할 경우,

std::vector< std::pair<int,int> > v(mmap.begin(), mmap.end()); 

을 또는 : 그래서, 당신은과 multimap에서 벡터를 초기화하는 생성자를 사용할 수 있습니다 std::back_inserter,하지만 그 때문에 벡터 재 할당에 일반적으로 느린 것 :

std::copy(mmap.begin(), mmap.end(), std::back_inserter(v)); 

편집,536,다른 질문에 답하기 위해 비슷한 방법으로 벡터를 멀티 맵으로 변환 할 수 있습니다.

std::multimap<int,int> mmap(v.begin(), v.end()); 

이, 물론, vstd::vector< std::pair<int,int> > 있다고 가정 다음과 multimap은 반복자 범위를 받아들이는 생성자가 있습니다.

+0

C++의 연관 컨테이너 값 유형에는 상수 키가 있습니다. 즉, std :: multimap :: value_type은 std :: pair 입니다. 그 이유는 Key가 일정하지 않다면 컨테이너 상수를 깨는 non-const 반복자를 통해 변경할 수 있기 때문입니다 (요소는 키 업데이트 이후 잘못된 위치에있게됩니다) –

1

를 매핑하는 벡터를 변환 찾고 있던 문제에 대한 죄송합니다 나는 순진 접근 방식은 또한 가장 효율적인 하나라고 생각 다음과 multimap 반복하되,과에 각 요소를 추가 벡터. 최적화하기 전에 시작하기 전에 v.reserve(m.size)해야합니다.

요소는 일반적으로 멀티 맵의 트리에 힙을 통해 분산되어 저장됩니다. 벡터의 경우 연속 된 메모리에 있어야합니다. 이렇게하려면 실제로 복사해야합니다.

+0

그렇다면 for_each를 사용하면 가능합니까? – yesraaj

+1

필요 없음 : vector :: assign (Iter begin, Iter end)은 메모리 allcoation과 루프를 모두 처리하는 단일 작업입니다. – MSalters

관련 문제