2016-06-09 2 views
6

반복을 처리 할 때 std::unordered_multimap 키 객체의 고유성에 대해 궁금합니다.std :: unordered_multimap의 키 고유성 보장

포인트를 설명하려고합니다.지도의 키 유형과 일부 데이터를 연결해야합니다.이 데이터는 Hash 또는 KeyEqual 요소로 간주되어서는 안되지만, 별도의지도를 저장하지 않아야합니다. 그것은 (최적화 목적으로).

그래서 내 생각과 관련된 코드는 다음

문제는 이것이 잘 작동하지만, 키의 첫 번째 요소로 검색한다는 사실에 대한 보장이 없다는 사실에서 발생
struct Key { 
    void* data; 
    mutable bool attribute; 

    Key(void* data) : data(data), attribute(false) { } 
    bool operator==(const Key& other) const { 
    return data == other.data; 
    } 
}; 

struct KeyHash { 
    size_t operator()(const Key& key) const { 
    return std::hash<void*>()(key.data); 
    } 
}; 

class Foo { 
public: 
    int i; 
    Foo(int i) : i(i) { } 
}; 

std::unordered_multimap<Key, Foo, KeyHash> map; 

단일 요소에 매핑되는 std::pair<const Key, Foo>은 항상 동일합니다. pairconst Key의 인 것은 내가

void* target = new int(); 
map.emplace(std::make_pair(target, Foo(1))); 
map.emplace(std::make_pair(target, Foo(2))); 


auto pit = map.equal_range(target); 
pit.first->first.attribute = true; 
std::cout << std::boolalpha << (++pit.first)->first.attribute << endl; 

을 할 경우 내가 무슨 생각을 확인한다 false를 얻을 수 있도록지도의 모든 요소는, 가치에 의하여 키의 복사본을 가지고 같은 소리. 따라서 동일한 키 (값이 std::unordered_map이므로 원하는 값)가 여러 개인 경우 키를 저장하는 데 많은 공간이 낭비됩니다.

나는 나를 키를 사용하여 속성을 페어링 할 수 있지만 반복자의 두 가지 수준의 작업을 필요로하기 때문에 적은 깨끗한 모든 것을 만드는

struct Value 
{ 
    std::vector<Foo> foos; 
    bool attribute; 
}; 

std::unordered_map<void*, Value> map; 

같은 다른 솔루션보다는 뭔가를 볼 수 없습니다.

다른 해결책이 있습니까?

+0

'boost :: multiindex' 만 사용하십시오 – Slava

+2

'map [target] = Foo (1);'std :: unordered_multimap'는 연산자'[]'를 과부하하지 않습니다 –

+0

요구 사항이 무엇인지 명확하지 않습니다. 'std :: unordered_map >'과 같은 것을 찾고 계신지요? 그러면 키를 복제하지 않고도 여러 값을 동일한 키와 행복하게 연결할 수 있습니다. –

답변

2

23.5.5.1 클래스 템플릿 unordered_multimap 개요 [unord.multimap.overview]

1 unordered_multimap은 동일 키 (각각의 키 값의 여러 복사본을 포함 할 수있다 unordered_multimap 인스턴스를 지원하는 순서화 연관 컨테이너) 키를 사용하여 다른 유형의 mapped_type 값을 연결합니다. unordered_multimap 클래스는 순방향 반복자를 지원합니다. 그런 다음 잠재적으로 unordered_map<K, vector<V>>이 더 적합 할 수있는 키의 단일 사본을 좋아하면

unordered_multimap는 키의 복사본을 여러 개 포함 할 수있다.

관련 문제