用于std :: unordered_map的自定义分配器,以设置增量值

时间:2019-03-18 10:02:02

标签: c++ unordered-map

我的类型如下:

std::unordered_map<std::string, int> map;

int字段是字符串的索引,其他人将使用它。现在,如果有人通过以下方式查询此地图:int id = map["foo"],并且如果foo不在地图中,那么我希望地图添加新的键,例如foo ,然后将其值设置为 map.size()(假设不会删除任何元素,因此可以将map.size()用作新索引)。

那么我可以这样做吗? (例如,将分配器设置为模板参数)

还是有更好的数据结构来做到这一点? (我考虑了集合或无序集合,但是从集合中获取索引似乎太复杂了)

1 个答案:

答案 0 :(得分:2)

  

那么我可以这样做吗(例如,将分配器设置为模板参数)

不是。您可以设置一个分配器,但是分配器的目的是在容器请求时分发内存。您无法随便提供一个可以完成您想要的操作的分配器,因为您无法预测容器在标准库实现中将如何使用您的分配器。

您想做的也是破解。应该只提供分配器来管理自定义内存资源,并且不应期望除了遵守标准分配器要求之外还能做更多的事情。

就像以前一样,如果所有人都希望提供的东西大多是{em> a std::unordered_map,但需要对operator[]进行调整,那么通往它的道路就很容易:

template<typename K, typename V, typename... OtherArgs>
struct my_uomap : std::unordered_map<K, V, OtherArgs...> {
    using my_uomap::unordered_map::unordered_map; // Inherit the c'tors
    V& operator[](K const& k) {
       // Do something custom
    }
    // And the other overload too
};

不要让反对者对您从标准库容器继承感到恐惧。仅当您多态删除对象时,这才是一个问题。即使您应该牢记这一点,也很少使用标准容器。