C++;使用邻接列表表示的循环依赖混淆 对不起,我对C++缺乏经验,但我花了一些时间来解决循环依赖问题,因此提出了这个问题。 我试图用C++表示邻接表。
我有structC++;使用邻接列表表示的循环依赖混淆 对不起,我对C++缺乏经验,但我花了一些时间来解决循环依赖问题,因此提出了这个问题。 我试图用C++表示邻接表。,c++,adjacency-list,cyclic-reference,C++,Adjacency List,Cyclic Reference,我有struct节点 struct Node{ int data; unordered_set<Node, Hash> links; bool operator == (Node const& other) const{ return (data == other.data); } Node(){ } Node(int data){ this->data = data;
节点
struct Node{
int data;
unordered_set<Node, Hash> links;
bool operator == (Node const& other) const{
return (data == other.data);
}
Node(){
}
Node(int data){
this->data = data;
}
};
我注意到Hash
使用Node
和Node
使用Hash
如果出于本练习的目的,我想在单个文件中声明所有内容,那么我应该首先声明哪个文件 我尝试了向前声明
散列
和节点
,并首先定义它们中的任何一个,但没有编译它们
PS:这不是家庭作业,我正在尝试在线解决图形算法难题延迟定义
Hash::operator()
直到定义节点之后
并在Hash
之前声明节点。只要不做任何操作,就可以引用不完整的类型
class Node;
class Hash{
public:
size_t operator()(const Node &node) const;
};
class Node{
public:
int data;
unordered_set<Node, Hash> links;
};
inline size_t Hash::operator()(const Node &node) const{
return node.data;
}
类节点;
类散列{
公众:
size_t操作符()(const Node&Node)const;
};
类节点{
公众:
int数据;
无序设置链接;
};
内联大小\u t哈希::运算符()(常量节点和节点)常量{
返回node.data;
}
通过将哈希实现移动到节点
完全定义后的某个点来解析语法是不够的。无论顺序如何,您都无法编译它,因为节点
的无序集
期望节点
是一个完整的类型,即需要完全定义该类型
除了拆分Hash::operator()
的定义外,还需要将unordered\u集的第一个类型参数更改为指针,最好是智能指针:
unordered_set<shared_ptr<Node>, Hash> links;
...
size_t Hash::operator()(const shared_ptr<Node> &node) const{
return node->data;
}
无序设置链接;
...
大小\u t哈希::运算符()(常量共享\u ptr和节点)常量{
返回节点->数据;
}
常规指针也可以工作,但是您必须单独管理节点的内存-例如,将所有节点放置在一个向量中。您可以使用向量来存储邻接列表。将更容易有趣的是,g++4.9/g++5不编译,抱怨Node
是一个不完整的类型,但是clang++编译代码。@vsoftco我想我看到了一个关于这个差异的问题,并试图找出这两个编译器中哪一个是正确的,但我似乎找不到它,我不记得答案是什么了。@dasblinkenlight上面的代码似乎是UB,我只是问了一个问题@vsoftco似乎提出了不同的建议。@CoffeeandCode我认为这个问题在C++11标准中得到了澄清,但不确定C++03。
unordered_set<shared_ptr<Node>, Hash> links;
...
size_t Hash::operator()(const shared_ptr<Node> &node) const{
return node->data;
}