Я реализую задачу Кевина Бэкона на шесть градусов и пишу класс для актерского узла.
Я могу использовать набор, но не контейнер hash_set для хранения определенного пользователем класса. Зачем? сообщение об ошибке показывает: ошибка C2440: «приведение типа»: невозможно преобразовать из «const ActorGraphNode» в «size_t»
1> Нет определенного оператора преобразования, доступного для выполнения этого преобразования, или оператор не может быть вызван ….
#include <hash_set>
#include <set>
class ActorGraphNode{
public:
string ActorName;
//hash_set<ActorGraphNode> linkedActors;
set<ActorGraphNode> linkedActors;
ActorGraphNode(string name):ActorName(name){}
void linkCostar(ActorGraphNode actor){
linkedActors.insert(actor);
actor.linkedActors.insert(*this);
}
bool operator<( const ActorGraphNode& a ) const
{ return ActorName < a.ActorName ? true : false;}
};
Неудивительно, hash_set
требует от вас реализации хэш-функции для вашего типа.
class ActorGraphNode{
public:
string ActorName;
hash_set<ActorGraphNode> linkedActors;
//set<ActorGraphNode> linkedActors;
ActorGraphNode(string name):ActorName(name){}
void linkCostar(ActorGraphNode actor){
linkedActors.insert(actor);
actor.linkedActors.insert(*this);
}
bool operator<( const ActorGraphNode& a ) const
{ return ActorName < a.ActorName;}
bool operator ==( const ActorGraphNode& a ) const
{ return ActorName == a.ActorName;}
operator size_t() const
{
return hash<string>()(ActorName);
}
};
Спасибо всем за ваши ответы и комментарии. Вот мой обновленный код с вашей помощью. плюс для функции linkCostar () теперь я использую проход по ссылке:
class ActorGraphNode{
public:
string ActorName;
hash_set<ActorGraphNode> linkedActors;
ActorGraphNode(string name):ActorName(name){}
void linkCostar(ActorGraphNode& actor){
linkedActors.insert(actor);
actor.linkedActors.insert(*this);
}
bool operator==( const ActorGraphNode& a ) const
{ return ActorName == a.ActorName ? true : false;}
operator size_t() const
{
const int HASHSIZE = 501;
int seed = 131;
size_t sum = 0;
for(size_t i = 0; i < ActorName.length(); ++i)
sum = (sum * seed) + ActorName[i];
return sum % HASHSIZE;
}
};