2014-02-15 2 views
7

저는 C++ 프로그래밍에 비교적 익숙하며 누군가가 저를 위해 몇 가지 질문을 명확히 할 수 있는지 궁금합니다. std :: set와 std :: map의 차이점

http://www.cplusplus.com/reference/map/map/

http://www.cplusplus.com/reference/set/set/

나는 STL 이진 검색 나무를 구현하는 방법에 읽어 봤는데 내가 지속적으로 이러한 수행하기위한 방법으로 언급되는 표준 : 설정 및 표준 : :지도를 몰래 보관 작업. 그렇지만이 둘의 차이점은 무엇입니까? 나에게 양쪽 모두 거의 동일하게 보입니다. 특정 작업을 위해 다른 것보다 나을 때가 있다는 것에 눈치 채지 못하는 것이 있는지 확실하지 않습니다. 배열이나 벡터에서 값을 취하는 STL 바이너리 검색 트리 (예 : 속도)를 구현하기 위해 std :: map을 통해 std :: set를 사용하면 어떤 이점이 있습니까?

누군가이 개념을 이해하는 데 도움이된다면 크게 감사하겠습니다.

+0

'set'은 요소, 고유 요소를 저장하며'map'은'key' +'value'로 구성된'pair'를 저장합니다. – user2485710

+0

이진 검색 트리를 구현하는 데 어떻게 사용할 수 있는지 모르겠습니다. 그들이 지정하는 인터페이스와 복잡성은 이진 탐색 트리보다 더 강력한 추상화이며이를 통해 구현 될 수 있습니다. – pmr

답변

6

std::setstd::map은 모두 associative containers입니다. 차이는 std::sets 전용 키를 포함하는 것으로하고, 연관된 값이 std::map에있는 동안, 즉
A -> B 있다면, [A] = B, 이것은 hashing처럼 작동 대신하지 O(1), O(log N) 매핑.

O(1) 시간에 작동을 제공하는 unordered_map을 더 볼 수 있습니다.

std::set은 데이터를 정렬 된 형식으로 유지합니다.
둘 다 구현은 AVL 또는 Red-Black 나무와 같은 균형 잡힌 나무에 의해 수행되어 O(logN) 시간 복잡도를 제공합니다.

중요한 점은 둘 다 고유 값을 저장할 수 있다는 것입니다. 그것을 극복하기 위해서는 multimapmultiset도보아야합니다.

희망이 도움이됩니다.

업데이트 : 이것은 O(log n) 작업이 재 균형 단계의 측면에서 레드 - 블랙 트리가 더 효율적이다 AVL과 동시에 레드 - 블랙 트리 재 분산 순환의 경우는 O(1) 작업입니다 그리고 그것이 더 일반적으로 사용되는 가능한 이유 중 하나.

+0

예를 들어 정수 값만있는 배열이나 벡터가 있다고 가정 해 보겠습니다. 이 모든 값을 이진 검색 트리에 저장하려면 세트가 원하는 모든 작업을 처리 할 수 ​​있고지도가 필요하지 않겠습니까? 정확히 내가 정확하게 이해하고 있는지 확인하려고 – Valrok

+0

정확히! 그러나 이러한 내장 된 기능은'C '에서 처음부터 만들 때보 다 다소 느리다는 것을 알아야합니다. –

+0

@Aseem Goyal 당신은 std :: map, std :: unordered_map 등등의 전형적인 std 라이브러리 구현이 원시 C?를 사용하여 자신의 컨테이너를 작성하는 것보다 느리다는 것을 의미합니까? – Zebrafish

관련 문제