2014-12-30 3 views
5

std::map과 함께 사용할 사용자 지정 할당자를 구현하는 방법에 대한 몇 가지 지침을 찾고 있습니다. 컨테이너의 각 요소 (이 컨테이너의 기본값)를 할당하지 않고 수백만 개의 항목으로지도를 채우는 데 관심이 있습니다. 그 이유는지도를 사용하여 차트 (QCustomPlot)의 샘플을 저장하는 타사 라이브러리에 데이터를 전달하는 것이고 큰 시간 시리즈를 플로팅 할 때 성능이 저하되는 것을 느낄 수 있기 때문입니다.std :: map에 사용할 사용자 지정 할당자를 구현하는 방법?

std::map의 크기를 미리 알고있는 경우 하나의 할당으로이 작업을 수행 할 수 있습니까?

EDIT : 노드가 컨테이너로 오름차순으로 공급됩니다.

+0

아마도이 질문에 대한 답변은 무엇입니까? http://stackoverflow.com/questions/13049340/initializing-a-stdmap-when-the-size-is-known-in-advance –

+1

가능 합니다만, 필요한 크기는'(sizeof (Key) + sizeof (값)) * num_elem'. 'map '이 할 첫 번째 작업 중 하나는 ['rebind_alloc'] (http://en.cppreference.com/w/cpp/memory/allocator_traits)이기 때문에 어느 정도 할당량을 늘려야합니다. 각 요소를 보유하는 데 사용하는 내부 트리 노드 유형. 그것 이외에, 내 충고는'std :: allocator'와'std :: allocator_traits' 문서를 읽은 다음 stdlib이 어떻게 이전의 것을 구현 하는지를 보게 될 것이다 (당신이 그 주제에 대한 튜토리얼을 찾을 수 없다고 가정 할 때). – Praetorian

+1

그래프에 표시되는 것들은 대개 순차적이므로 boost :: flat_map (이것은 정렬 된 벡터입니다)은 std :: map보다 낫습니다. –

답변

1

이 경우 사용자 지정 할당자가 수행 할 수있는 유일한 작업은 내부로 인해 std :: map의 최종 크기와 오버 헤드를 알고있는 경우 정렬로 인해 발생하는 기본 할당자가 사용하는 오버 헤드를 피하는 것입니다 포인터를 사용하면 필요한 크기의 버퍼를 예약 할 수 있으며 사용자 정의 할당자는 모든 연속 메모리를 사용합니다.

저장할 메모리 양은 맵에서 사용하는 유형에 따라 다르며 그리 높지 않을 것입니다. OO 된 TIIb로 의견을 언급하고 최선을 dau_sama으로

는 부스트 : flat_map을, 또는 당신이 제 3 자 lib 디렉토리를 변경할 수없는 경우 당신은 어쨌든

std::vector<std::pair<Key,Value>> 

를 통해 사용자 정의를 할 수 그것은 당신이 적응할 수있는 반복자 (iterator)의 어떤 유형을 받아들이지 않는다면 여전히 운이 좋을 것입니다.

관련 문제