std :: map в классе шаблонов & lt; T & gt; с ключом & lt; T & gt;

У меня есть пользовательский двоичный класс дерева, который содержит значения типа шаблона 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

Решение

Сделать качественный компаратор:

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]