模板类<t>中的std :: map,键为<t> </t> </t>

时间:2012-09-09 16:36:54

标签: c++ templates stdmap

我有自定义二叉树类,它包含模板类型T的值(它可以是值或指针)。每个值都用数字封装(此数字用于在树中搜索)。我希望在我的树类中有一个std::map,以便快速O(1)访问没有数字的对象。

template <typename T>
stuct BSTNode 
{
  T value;
  int searchValue;
}

template <typename T>
class BST 
{
  BSTNode<T> * root;
  std::map<T, BSTNode<T>> cache;
  //... etc.
}

示例:我在值a下的树中插入了类实例n。现在我想获得与此a相关联的节点。我无法搜索树,因为我没有n。所以我想使用a,并std::map获取node = map[a]。现在我可以做node->n

我怎样才能做到这一点?我可以覆盖std::map的比较方法:

bool operator()(const void * s1, const void * s2) const

但它同时对值和指针不起作用:无法将参数1从const double转换为const void *

1 个答案:

答案 0 :(得分:2)

制作一个特定的比较器:

template <typename T>
struct NodeComp
{
    bool operator<(T const & lhs, T const & rhs) const
    {
        return lhs < rhs;
    }
};

template <typename U>
struct NodeComp<U *>
{
    bool operator<(U * lhs, U * rhs) const
    {
        return *lhs < *rhs;
    }
};

现在您的地图可以这样定义:

template <typename T>
class BST 
{
    BSTNode<T> * root;
    std::map<T, BSTNode<T>, NodeComp<T>> cache;
}