12

我正在尝试使用 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,那么我可以在代码中使用 map hashmap<string, string>as hashmap<int, int>

有什么办法可以做到这一点,或者如果有更好的方法,请建议我。

谢谢维诺德

4

3 回答 3

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;

这是一种非常常见的模式。C++0x 通过提供改进的using语句使这更容易,但目前这是最好的。

于 2011-06-13T14:46:17.327 回答
2

C++98 和 03 不提供对模板 typedef 的支持,但您可以使用 C++0x 做到这一点。

在早期版本中,您可以使用具有值 typedef 的模板结构来执行您想要的操作:

template <typename T1, typename T2>
struct hashmap
{
    typedef std::map<T1, T2> type;
};

请注意,这是为了说明目的,您可能还需要额外的模板参数来涵盖比较运算符和分配器。

于 2011-06-13T14:46:18.327 回答
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)。

于 2011-06-13T14:53:18.470 回答