std::在临时类中映射<T>,键为<T>

std::map in tempate class <T> with key of <T>

本文关键字:gt lt 键为 映射 std      更新时间:2023-10-16

我有一个自定义的二进制树类,它保存模板类型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.
}

示例:我在树中的值n下插入了类实例a。现在我想要得到与这个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 *

制作一个跟踪比较器:

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;
}