2014-01-14 2 views
5

은 hashCode()와 equals()와 같은 메소드를 가지고 있습니다.이 메소드는 맵에서 각 객체를 식별하는 데 사용됩니다. C++은 기본 메소드가 없으며, 각 객체는 기본적으로 구현됩니다.Java 개발자 인 C++의 Map 이해 Java에서

지도가 이제 어떻게 사용자 지정 개체를 키 값으로 사용할 수 있습니까?

편집 : 키우면는 특히 자바 특정 인터페이스 방법으로 목표로하기 때문에 중복, 아무것도는 것을 의미 요구 사항,

답변

6

첫째, C++에서 std::map은 일반적으로 레드 블랙 트리가 아닌 해시 테이블입니다. std::unordered_map이라고하는 C++ 11의 해시 맵도 있습니다. 기본적으로 operator<을 사용하여 요소를 비교합니다. 당신은 또한 원하는 것을 사용하여 비교할 수있는 사용자 정의 비교기를 연결할 수 있습니다. 이것은 std::map에 대한 선택적 제 3 템플리트 인수를 사용하여 수행됩니다.

5

C++ std::map 찾는 것이 C++로 해본 정렬 된 맵은 누군가 자체 균형 이진 검색 트리 (보통 red-black 트리)로 구현됩니다. 즉, 키 유형은 strict weak ordering 일종이어야하며 less-than 연산자 또는 사용자 정의 비교 함수 작성기 형식이 될 수 있습니다.

std::map과 사용자 정의 유형을 키로 사용하는 방법에 대한 많은 게시물이 있습니다 (one example here 참조).

C++ 11

주요 유형에 대한 다양한 요구 사항 C++에서 (특히, 해시 함수와 평등 비교가 필요합니다)

2

지도와 해시 테이블의 HashMap되지이다 std::unordered_map, 오히려 정렬 된 맵이 (보통 적색 - 검은 색 나무로 구현 됨). 항목은 비교 함수를 사용하여 키별로 정렬됩니다. 기본 구현에서는 키에 operator<이 오버로드되어야하지만 직접 비교 함수를 지정할 수 있습니다.

여기에 C++지도 정보에 대한 참조 : http://en.cppreference.com/w/cpp/container/map

1

Java의 해시 맵은 시간 복잡성이 O (1)입니다. C++에서 red-black 트리 기반의 맵은 O (logN)의 시간 복잡성을 가지고 있습니다.

CSLM은 hread-safe, concurrentTreeMap은 그렇지 않습니다. CSLM는 참조 문서

JDK 1.6에서 추가되었다 : Java equivalent of C++ std::map?

1

C++ 맵은 정렬 된 맵이 아닌 부울 식 빌려 (A, B) 키 값을 비교하기 위해 사용하는 템플릿 해시 맵입니다. 기본값은 C++에서 클래스에 의해 오버로드 될 수있는 (A < B) 비교를 수행하는 less입니다. 대체지도는 다른 표현식을 사용할 수 있습니다.

1

std :: map은 템플릿 기반 클래스입니다.열쇠는 보장 엄격한 약한 순서라는 특정 개념과 일치해야합니다 :

  • 키가 적은보다 비교 (과부하 운영자 <하거나지도를 사용자 정의 비교를 제공) 요소 A가 B보다
  • 경우 소자 A가 B 이하이고, B가 C 미만이면, B가
  • 보다 작을 수 없다 다음은

여기 키로 지정 유형의 예이다 C 미만 :

#include <map> 
#include <iostream> 
struct Custom{ Custom(int c): c(c){} int c; }; 
bool operator< (Custom const &a, Custom const &b){ return a.c< b.c; } 
int main(){ std::map<Custom, int> m; m[Custom(42)]= 42; std::cout<< m[Custom(42)]; } 

즉, std :: map은 Java 해시 맵과 완전히 동일하지 않습니다. C++ 11에 대해서는 std::unordered_map이 있습니다. unordered_map을 사용하면 사용자 정의 유형을 해시 키로 유지하기 위해 자신 만의 유형에 대해 자신 만의 std :: hash 템플릿을 정의 할 수 있습니다.