ProgramingTip

벡터 또는지도, 어느 것을 사용할까요?

bestdevel 2020. 11. 27. 21:05
반응형

벡터 또는지도, 어느 것을 사용할까요?


나는 많은 사람들이 용기에 기대 요소의 수는 최강으로 작은 경우는 사용하는 것이 좋습니다 들었어요 std::vector대신 std::map반복하는 내가 만 조회에 컨테이너를 사용하는 겁니다하지.

이것의 진짜 이유는 무엇입니까?

분명히 맵의 조회 성능은 벡터의 성능보다 나쁠 수 없습니다 (나노초 / 마이크로 초에있을 수 있음). 메모리 내과 관련이 있습니까?

벡터가 가상 주소 공간의 조각화에서 맵보다 더 좋거나 나쁘나요?

Visual Studio (예 : Microsoft 구현)와 함께 제공되는 STL 라이브러리를 사용하고 있는데 다른 구현과 다른 점이 있습니까?


당신이 비교 나는하는 가정 map<A, B>으로 vector<pair<A, B> >.

첫째, 매우 작은 벡터에서 항목을 찾는 것이 맵에서 같은 것보다 쉽게 ​​빠를 수 있습니다. 벡터의 모든 메모리는 항상 연속적 컴퓨터의 캐시와 같은 것들과 더 잘 어울리고 숫자가 벡터에서 제안을 찾는 데 필요한 비교 횟수는지도와 거의 동일합니다. 매우 큰 컨테이너가 필요합니다.

맵이 벡터보다 빨라지는 지점은 구현, 프로세서, 맵에있는 데이터 및 프로세서 캐시에 메모리있는 것과 같은 미묘한 사항에 따라 진행됩니다. 일반적으로 맵이 더 빨라지는 지점은 약 5-30 개의 요소입니다.

대안은 해시 컨테이너를 사용하는 것입니다. 그들은 종종 hash_map또는 unordered_map. 명명 된 클래스 hash_map는 공식 표준의 일부가 아닙니다 (그리고 거기에 몇 가지 변형이 있습니다). std::tr1::unordered_map이다. 해시 맵은 종종 요소 수에 관계없이 조회 할 수있는 노멀 맵보다 빠르지 만, 실제로 더 빠른지 여부는 키가 무엇인지, 해시 맵, 처리해야하는 값 및 처리 방법에 따라 처리해야합니다. 키는 std :: map에서 비교됩니다. std ::지도와 같은 특정 순서로 항목을 유지하지 않습니다. 특히 키가 정수 또는 포인터 인 경우 해시 맵을 권장합니다. 단지 해시는 매우 빠르기 때문입니다.


맵은 일반적으로 이진 검색 트리로 구현하고 이진 트리를 걷는 것은 항상 약간의 오버 헤드 (비교 수행, 링크를 걷는 등)를 동반합니다. 벡터는 기본적으로 배열 일뿐입니다. 매우 약간의 양의 데이터 (아마도 8 개 또는 12 개 요소)의 경우 이진 검색 트리를 걷는 것보다 배열에 대한 선형 검색을 수행하는 것이 더 빠 사용하지 않습니다.

몇 가지 타이밍을 직접 실행하여 손익분기 점이 어디인지 확인할 수 있습니다. 4 개 요소, 8 개, 16 개 등을 검색하여 특정 STL 구현을 최적의 지점을 찾습니다.

맵은 힙 전체에 작은 할당을 많이 사용하는 경향이있는 반면 벡터는 연속적 률이있는 모든 요소를 ​​앞에서 뒤로 반복하는 경우 벡터의 캐시 적중률이 약간 더 나을 수 있습니다.


"기본적으로 필요한 때 벡터를 사용하십시오"-Bjarne Stroustrup.

숫자가 작은 순서도가 매우 도움이 될 것입니다.

http://homepages.e3.net.nz/~djm/cppcontainers.html


모든 삽입을 한 번에 수행하고 많은 조회를 수행하는 경우 벡터를 사용하고 삽입을 완료 할 때 정렬 할 수 있습니다. 그런 다음 lower_bound를 사용하여 빠른 조회를 수행하십시오. 항목이 많은 경우에도 맵을 사용하는 것보다 빠를 수 있습니다.


먼저 데이터에 맞는 컨테이너를 먼저 생각합니다. std :: vector는 C 또는 pre-STL C ++에서 배열을 사용하는 상황에서 사용됩니다. 연속적인 메모리 블록에 빠른 상수 시간 조회로 값을 저장합니다. std :: map을 사용하여 키를 값에 매핑해야합니다. 여기서 주요 겹침은 키로 size_t를 사용하는 벡터 대 맵입니다. 이 경우 두 가지 문제가 있습니다. 연속적입니까? 가능하다면 아마도 벡터로 메모리를 사용할 수 있습니다. 둘째, 조회 시간은 언제입니까? 일반적으로 O (log n) 조회 시간을 사용하는 벡터는 RB 트리로 구현하고 해시 맵 (예 : TR1 unorder_map)도 일반적으로 더 복잡합니다. (또는 그 해시)가 여러 값을 포함 할 수있는 버킷에 매핑되기 때문입니다.

쌍을 가진 경우 겨냥한 경우 : 벡터의 요소를 찾고 사용하여 요소를 벡터 수 있습니다. 그러나 이것은 이진 검색 실제로 std :: map만큼 빠입니다.

어쨌든 데이터를 명백한 방식으로 모델링하십시오. 조기 최적화는 종종 도움이되지 않습니다.


우리가 작은 용기에 대해 이야기하고 어느 것도 찾는 데 오래 걸리지 않을 것입니다. 매우 타이트한 루프에서 컨테이너를 검색하지 않는 한 시간 차이는 무시할 수있을 것입니다.

이 경우 컨테이너가 수행하려는 작업과 어떤 것이 일치하는지 작업합니다. 특정 값을 갖고있는 권한지도의 내장 된 메소드가 루프를 만들고 벡터를 반복하는 것보다 훨씬 (사용하기 복잡합니다).

당신은 시간이 여기저기서 몇 나노초보다 훨씬 더 가치가있을 것입니다.


기본적으로지도는 조회에 사용됩니다.

때로는 그러나 검색 std::vector대신 사용할 수도 있습니다 std::map.

키-값 쌍에 요소가 매우 적을 경우에서 키를 사용하여 반복 검색을 수행 할 수 있습니다 std::vector<std::pair<x,y>>.

특히 해싱과 힙에 데이터를 저장하는 것과 같은 맵의 다른 작업에 대해 해싱에 시간이 걸리기 때문입니다.

조회해야하는 요소가 더 많고 보유한 요소 목록에서 자주 조회하려는 경우에만 std ::지도에서 더 나은 차이를 볼 수 있습니다.

참고 URL : https://stackoverflow.com/questions/454762/vector-or-map-which-one-to-use

반응형