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

问题描述 投票:2回答:1

我有一个类型如下:

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

int字段是字符串的索引,将由其他人使用。现在,如果有人以这种方式查询这个地图:int id = map["foo"],如果foo不在地图中,那么我希望地图添加一个新的密钥作为foo并将其值设置为map.size()(假设没有元素将被删除,所以只使用map.size()作为新索引是可以接受的)。

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

或者有更好的数据结构吗? (我考虑了set或unordered set,但从集合中获取索引似乎太复杂了)

c++ unordered-map
1个回答
2
投票

我可以这样做吗?(例如将alloctor设为模板参数)

并不是的。您可以设置分配器,但分配器的目的是在容器请求时分发内存。您无法移植提供可以执行所需操作的分配器,因为您无法预测容器在标准库实现中使用分配器的确切程度。

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

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

不要让反对者吓唬你继承标准库容器。仅当您以多态方式删除对象时,才会出现此问题。即使您应该牢记这一点,但很少使用标准容器。

© www.soinside.com 2019 - 2024. All rights reserved.