在处理迭代时,我想知道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
的{{1}},听起来地图中的每个元素都有值的副本,所以如果我这样做
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
这允许我将属性与键配对,但是因为它需要使用两级迭代器,所以一切都不那么干净。
我还没有看到其他解决方案吗?
答案 0 :(得分:2)
23.5.5.1类模板unordered_multimap overview [unord.multimap.overview]
1 unordered_multimap是一个无序的关联容器,它支持等效键(一个实例) unordered_multimap可以包含每个键值的多个副本)并且将另一个值的值相关联 用键键入mapped_type。 unordered_multimap类支持前向迭代器。
unordered_multimap
可能包含密钥的多个副本,如果您希望密钥的单个副本,那么unordered_map<K, vector<V>>
可能更合适。