2017-02-06 5 views
2

Java 프로그램을 C++로 변환하려고합니다. 그래서, 자바 코드에서 사용되는 Linkedhashmap 데이터 구조가 있고 그것을 C++로 변환하려고합니다. C++에서 LinkedHashmap에 해당하는 데이터 유형이 있습니까?해당 링크 된 Hashmap C++에서?

std::unordered_map을 사용해 보았지만 삽입 순서가 유지되지 않습니다.

+0

아니요, 갖고 계시지 않습니다. 처음부터 못생긴 데이터 구조입니다. 누구도 표준화를 제안하지 않았습니다. –

+0

@DavidHaim hmmm. 그렇다면 어떻게 예측 가능한 반복 명령으로 해시 맵을 만들 수 있습니까? – emadalamoudi

+2

해시 맵의 삽입 순서가 왜 중요한지 직접 물어야합니다. –

답변

6

C++은 Java의 LinkedHashMap<K,V>을 모방하는 동작을 가진 컬렉션 템플릿을 제공하지 않으므로 매핑과 별도로 주문을 유지해야합니다.

이것은 std::list<std::pair<K,V>>의 데이터를 유지하고 키를 사용하여 항목의 빠른 룩업에 대해 별도의 std::unordered_map<k,std::list::iterator<std::pair<K,V>>> 맵을 유지함으로써 달성 될 수있다 :

  • 를 항목을 추가에서 해당 키/값을 추가 쌍을 목록 끝에 추가하고 키를 반복자 std::prev(list.end())에 매핑합니다.
  • 키로 항목을 제거하는 경우 해당 항목의 반복기를 찾아 목록에서 제거한 다음 매핑을 제거하십시오.
  • 항목을 바꿀 때 순서가 지정되지 않은지도에서 목록 반복기를 먼저 찾은 다음 해당 내용을 새 키 - 값 쌍으로 바꿉니다.
  • 값을 반복 할 때 간단히 std::list<std::pair<K,V>>을 반복하십시오.
+0

감사합니다. 이것이 내가해야 할 일이라고 생각합니다. 더 복잡해질지라도 최소한 주문을 유지해야합니다. 다시 한 번 감사드립니다 – emadalamoudi

+0

이것이 받아 들여지는 대답이기 때문에 LinkedHashMap보다 나쁜 것을 지적해야합니다. 1) 키로 조회 할 때 추가 간접 참조 2) 이레 이저 반복자에 Hash-Lookup이 필요합니다. 항목에 두 개의 링크 된 목록 (삽입 순서 및 해시 버킷)에 대한 포인터가 포함 된 통합 솔루션에는 이러한 단점도 없습니다. 그게 그렇게 중요한 건가? 말하기 어렵다/의존한다. 제안 된 솔루션은 이러한 LinkedHashMap보다 엄격하게 열등합니까? 예. – misberner