반복을 처리 할 때 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>
은 항상 동일합니다. pair
const 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;
같은 다른 솔루션보다는 뭔가를 볼 수 없습니다.
다른 해결책이 있습니까?
'boost :: multiindex' 만 사용하십시오 – Slava
'map [target] = Foo (1);'std :: unordered_multimap'는 연산자'[]'를 과부하하지 않습니다 –
요구 사항이 무엇인지 명확하지 않습니다. 'std :: unordered_map>'과 같은 것을 찾고 계신지요? 그러면 키를 복제하지 않고도 여러 값을 동일한 키와 행복하게 연결할 수 있습니다. –