我正在实施六度Kevin Bacon问题并为actor节点编写一个类。 我可以使用set而不是hash_set容器来保存用户定义的类。为什么?错误消息显示:错误C2440:'type cast':无法从'const ActorGraphNode'转换为'size_t' 1 GT;没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符....
#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;}
};
答案 0 :(得分:1)
不出所料,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);
}
};
答案 1 :(得分:0)
感谢所有人的回答和评论。这是我的更新代码,在您的帮助下。加上函数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;
}
};