我正在尝试使用unordered_map。但在某些服务器中我们没有tr1库。在那些情况下,我想使用地图。 所以,我想写一个头文件,我将使用以下行之一。
typedef tr1::unordered_map hashmap;
typedef map hashmap;
我的问题是我在这里使用不同类型的地图。
map<string, string>
map<string, int>
map <string, map<string,int>> ..etc
如果我可以使用typedef别名map或unordered_map作为hashmap,那么我可以在代码中将地图用作hashmap<string, string>
,hashmap<int, int>
。
有没有办法做到这一点或如果有更好的方法请建议我。
由于 维诺德
答案 0 :(得分:10)
你需要使用一个所谓的元函数:
template <typename Key, typename T>
struct hashmap {
typedef std::unordered_map<Key, T> type;
// or
//typedef std::map<Key, T> type;
};
将使用这样的:
hashmap<int, float>::type some_map;
这是一种非常常见的模式。通过提供改进的using
语句,C ++ 0x使这更容易一些,但目前这是最好的。
答案 1 :(得分:2)
C ++ 98和03不支持模板typedef,但你可以用C ++ 0x来实现。
在早期版本中,您可以使用具有值typedef的模板结构来执行您想要的操作:
template <typename T1, typename T2>
struct hashmap
{
typedef std::map<T1, T2> type;
};
请注意,这是出于污染目的,您可能还需要额外的模板参数来覆盖比较运算符和分配器。
答案 2 :(得分:2)
这可以在c ++ 0x中实现,但目前不支持别名非专用模板。请参阅:https://en.wikipedia.org/wiki/C%2B%2B0x#Template_aliases
作为一种解决方法,您可以使用宏代表地图类型,即:
#ifdef HAVE_TR1
#include <tr1/unordered_map>
#define HASH_MAP std::tr1::unordered_map
#else
#include <map>
#define HASH_MAP std::map
#endif
在一个不相关的说明中,我会将别名称为“ASSOC_MAP”,甚至只调用“MAP”而不是“HASH_MAP”。后一个名称听起来像是在使用哈希,让用户认为它具有恒定时间的插入和删除,而不是O(log N)。