STD :: UNOREDED_MAP的自定义分配器以设置增量值

custom allocator for std::unordered_map to set a incremental value

本文关键字:设置 分配器 自定义 UNOREDED MAP STD      更新时间:2023-10-16

我有以下类型:

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

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

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

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

所以我可以这样做吗?(例如,将Alloctor设置为模板参数)

不是真的。您可以设置分配器,但是分配器的目的是每当容器请求时分发内存。您无法便便提供可以执行您想要的事情的分配器,因为您无法预测容器将如何在标准库实施中使用分配器。

您想做的也是一个黑客。仅应提供分配器来管理自定义内存资源,他们不应该期望做更多的事情,而不是遵守标准的分配要求。

,如果所有人都希望做的是提供主要是 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
};

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