保证std :: unordered_multimap中的键唯一性

时间:2016-06-09 14:52:11

标签: c++ c++11 stl unordered-multimap

在处理迭代时,我想知道std::unordered_multimap内部关键对象的唯一性。

我将尝试解释这一点:我需要将一些数据与地图中的密钥类型相关联,这些数据不应在HashKeyEqual元素中考虑,但我需要它避免与其一起存储单独的地图(出于优化目的)。

所以与我的想法相关的代码如下:

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

这允许我将属性与键配对,但是因为它需要使用两级迭代器,所以一切都不那么干净。

我还没有看到其他解决方案吗?

1 个答案:

答案 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>>可能更合适。