2016-11-20 1 views
2

키 ("달걀")를 공유하는 두 개의 요소 (6과 747)가 있습니다. 나는 열쇠를 공유하는 모든 요소를 ​​찾고 싶다. ("달걀"이라고하자. 그러나 모든 열쇠에 대해 현실에서 그렇게하겠다.) 그렇게하는 방법?정렬되지 않은지도의 충돌을 검색하는 방법은 무엇입니까?

데이터 구조에서 컨테이너 나 다른 것을 가져 오는 방법이 있어야합니다. . .

+0

정렬되지 않은지도에서 다른 값을 가진 동일한 키를 가질 수는 없지만 실제로 질문을하지는 않습니다 ... 여러 개의 다른 키의 해시가 동일하고 출력되는지 확인하는 방법을 묻고 있습니까? 그 버킷? 그렇다면 krzaq의 대답은 정확합니다. – Banex

+0

아직 받아 들일 수 없습니다. @Banex, 시간 제한! 정말로 나는 혼란 스러웠다, krzap는 도와 줬다! 감사! – gsamaras

답변

2

키의 값이이고 키의 해시가 인 것으로 잘못 생각하고 있습니다. 질문하지만 질문에 대답 : 당신이 버킷 반복자와 unordered_mapbucket() 멤버 함수를 사용할 수 있습니다

간단하고 대부분 올바른 관점에서
std::unordered_map<int,int,dumbest_hash> m; 
m[0] = 42; 
m[1] = 43; 

size_t bucket = m.bucket(1); 

for(auto it = m.begin(bucket), e = m.end(bucket); it != e; ++it) { 
    cout << "bucket " << bucket << ": " << it->first << " -> " << it->second << '\n'; 
} 

demo

가 정렬되지 않은 컨테이너 인터페이스의 관점에서 자신의 주문 대응을 모방. 즉, map에서 중복 키를 허용하지 않으면 어느 쪽도 unordered_map이됩니다.

unordered 검색 속도를 높이기 위해 해싱 기능을 사용하지만 두 개의 키가 동일한 해시를 가질 경우 반드시 같은 값을 가질 필요는 없습니다. 동작을 순서가있는 컨테이너와 비슷하게 유지하려면 unordered_setunordered_map은 해시 값이 충돌하지 않을 때 요소가 실제로 같을 때 (operator== 또는 제공된 비교자를 사용하여) 요소가 같다고 간주합니다.

원근감을 내기 위해 "eggs""chicken"이 동일한 해시 값을 갖고 있다고 가정하고 평등성 검사가 없다고 가정 해 봅시다.

unordered_map<string, int> m; 
m["eggs"] = 42; 
m.insert(make_pair("chicken", 0)); // not inserted, key already exists 
assert(m["chicken"] == 42); 

을하지만 같은 맵에 중복 키를 허용하려면, 단순히 unordered_multimap를 사용 : 다음 코드는 "올바른"일 것이다.

+0

무엇을 의미합니까? 6과 747 값과 "달걀"이 중요하지 않습니까? 아, 해시 된 값이 값이 아니거나 키가 아닙니다. 그렇습니까? – gsamaras

+0

해시 된 값은 맵 내부의 일종입니다. ''eggs ''는 값의 열쇠입니다. 그러나 맵은 실제로 그것의 수치 해시를 사용하여 일을 빠르게합니다. ''닭고기 ''와 같은 또 다른 키가 같은 해쉬를 생성 할 수도 있습니다 (예제에서 'dumbest_hash'와 함께 사용됩니다).하지만 이들은 등가 키가 아니기 때문에 동등한 것으로 취급되지 않습니다. 성능 저하 만 보게 될 것입니다. – krzaq

+0

네, 고마워요.그러나 이제는 키가 아니라 실제로 해시 값을 공유하는 요소를 제공하는 것에 응답하고 있습니다. (실제로 원하는 것이지만 알지 못합니다.) 맞습니까? – gsamaras

2

정렬되지 않은지도에는 키를 공유하는 요소가 없습니다.

정렬되지 않은 멀티 맵 않습니다.

umm.equal_range(key)을 사용하면지도에서 지정된 키와 일치하는 요소를 설명하는 반복자를 pair 가져올 수 있습니다.

그러나 해시 컨테이너에 대해 이야기 할 때 "충돌"은 일반적으로 동일한 해시 키가 아닌 동일한 키가있는 요소를 나타냅니다.

또한 멀티 맵 대신 unordered_map<key, std::vector<value>>을 사용하는 것이 좋습니다.

+1

마지막 문장은 나에게 불꽃을주었습니다. 내가 왜해야하지? 멀티 맵보다 빠릅니다. 그것에 대해 읽으려는 어딘가에서 가르쳐 주시겠습니까? 아니면 다른 질문입니다. 여기에 설명하지 않겠습니까? – gsamaras

+0

좋은 지적입니다. 중복 해시 값을 가진 Afaik 요소는 링크 된 목록에 보관되지만 멀티 맵의 동일한 키 값에 대해서는 확신 할 수 없습니다. 그래도'operator [] '를 사용하면 벡터는 거의 모든 유스 케이스에서 효율적입니다. – krzaq

+0

@gsam iteration 무 순서 컨테이너의 무효화 규칙은 키 중복과 노드 기반 키 저장 및 값 저장을 강제합니다. 벡터에는 동일한 보장이 없으므로 키 중복을 건너 뛰고 값을 연속적으로 저장할 수 있습니다. 게다가, 나는지도에서'operator []'를 좋아하고, 벡터에 대한지도는 그것을 처리한다. 그것은 고려 가치가있다. – Yakk

관련 문제