У меня есть пользовательский двоичный класс дерева, который содержит значения типа шаблона 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 *
,
Сделать качественный компаратор:
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;
}
Других решений пока нет …