最近,我一直在使用一种较少使用的 STL 功能 - 自定义分配器,我需要一些认真的帮助来减少我的语义开销。以无序映射的定义为例,它将文件名映射到一对整数的无序映射,并将 shared_ptr 映射到 token ,但使用自定义分配器。
typedef std::pair<int, int> token_key_type;
typedef std::unordered_map<
token_key_type,
std::shared_ptr<Token>,
std::hash<token_key_type>,
std::equal_to<token_key_type>,
Allocator<
std::pair<
const token_key_type,
std::shared_ptr<
Token
>
>
>
> filename_map_value_type;
std::unordered_map<
string,
filename_map_value_type,
std::hash<string>,
std::equal_to<string>,
Allocator<
std::pair<
const string,
filename_map_value_type
>
>
> tokens;
那是404个字符的定义。然后要构造它,我必须为每个模板参数传递默认值,除了不能默认构造的分配器和不存在定义的存储桶计数,导致另外 168 个字符仅用于构造该死的东西。另外,当然,每次我想插入时都一样,因为第一个映射的值类型也必须这样构造。
有什么方法可以避免所有这些而不必编写我自己的 unordered_map?它开始严重降低我的工作效率。
编辑:抱歉!我的意思是,一般来说,对于 STL 容器,不仅仅是 unordered_map 具体来说,这只是最坏的情况。我也遇到了常规映射、unordered_set 等问题,无法编写一个函数来为我可能单独需要的所有可能的 STL 容器执行所有这些操作。
最佳答案
icecrime 的解决方案也可以通过下面的代码在旧的编译器上完成,只是略显丑陋。您还可以添加工厂函数来简化构造。
template<typename K, typename V> struct unordered_map_type
{
typedef std::unordered_map<
K,
V,
std::hash<K>,
std::equal_to<K>,
Allocator<
std::pair<const K, V>
>
> type;
};
typedef std::pair<int, int> token_key_type;
typedef unordered_map_type<token_key_type, std::shared_ptr<Token> >::type filename_map_value_type;
关于c++ - 降低 C++ 中的模板复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4354004/