2017-11-14 9 views
0

C++ 11의 unordered_map 라이브러리로 작업 중이며 버킷 작동 방식에 대해 약간 혼란 스럽습니다. cplusplus 웹 사이트의 문서에 따라 그들이 생각했던대로 작동하지 않는다는 것이 분명합니다.unordered_map 버킷과의 충돌

내 쌍의 키가 동일한 버킷으로 해시 될 것으로 예상됩니다. 예를 들면 :

#include <iostream> 
#include <unordered_map> 

using namespace std; 

int main() { 
    unordered_map<string, string> map; 
    map.emplace("abc", "bca"); 
    map.emplace("abc", "bac"); 
    cout << map.bucket_size(map.bucket("abc")) << endl; 
    cout << map.bucket_count() << endl; 
    return 0; 
} 

, 그것이 여기 출력은 그러나

2 
1 

될 것이라고했다 나의 기대

1 
2 

내가 무엇 출력이 훨씬 더 이상적 내 기대보다 이해 가능한 한 적은 체인을 유지하는 것이 목표이지만, 내 목적에 따라이 체인 및 충돌이 발생하여 프로그램에 필요한 계산을 수행 할 수 있기를 바랍니다. 이것을 성취하기위한 단계가 빠졌습니까?

답변

0

두 가지가 나오는데 하나는 동일한 키를 두 번 넣는 것입니다. 무슨 일이 일어나는지 두 번째 emplace 실제로 실패합니다지도 데이터 구조 중 하나를 사용하면 키 당 하나의 값을 얻을 수 있기 때문에. 보시면 "abc"가 들어있는 양동이에 "bca"라는 값이 있습니다.

bucket_count와 관련하여 특정 값일 수 있으며 구현이 정의되어있을 가능성이 없습니다. 예를 들어 구현을 생성하는 경우 항상 적어도 2 개의 버킷을 생성 할 수 있습니다. 항목이 삭제되었다고 결정하기 전에 두 번째 항목을 삽입 할 때 두 번째 버킷을 만들 수도 있습니다.

+0

내가하려고하는 것은 데이터 구조를 사용하여 정렬 할 때 동일한 단어를 연결하는 것입니다. 예를 들어, "ate"와 "eat"이 "aet"에서 충돌하기를 원합니다. 그냥 키를 정렬 된 단어로 유지하고 내가 추가하는 값 벡터를 만들어야합니까? – TrueAzure

+0

@TrueAzure,지도가 아닌 멀티 맵 (키가 정렬 된 값)을 원할 수도 있습니다. 아마 2 단계 (지도, 벡터) 접근법을 시도하는 것보다 쉽습니다. – paxdiablo

+0

벡터로 처리 할 수 ​​있었지만 너무 느립니다. 내 학교의 실험실 서버에서 .2s 미만의 100k 단어 사전 텍스트 파일에서이 작업을 수행하려고합니다. 벡터 구현은 .3s를주고받습니다. 레드 - 블랙 트리로지도가 구현되지 않았습니까? – TrueAzure