我有自定义二叉树类,它包含模板类型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 *
。
答案 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;
}