我是来自C#的C ++回归者。那么,请理解这个问题对你来说非常明显。 问题是"为什么不能使用指向矢量的指针?"
什么是正确的或更好的?为了节省一个Node对象的内存,我尝试了第一个并且遇到了很多奇怪的错误,但是第二个很好。在第一个误解中会是什么?
供参考: 以下代码用于检查有向图中两个节点之间是否存在路由。
class Node {
public:
int id;
bool visited = false;
vector<Node&>* leaves;
Node (int id) : id(id){}
};
bool hasRoute(const Node& A, const Node& B){
if(A.leaves == NULL || A.visited == true)
return false;
A.visited = true;
vector<Node&>::iterator i = A.leaves->begin();
for(; i != A.leaves->end(); ++i) {
if((*i).id == B.id || hasRoute(*i, B))
return true;
}
return false;
}
这导致20个错误,如:
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin /../ include / c ++ / v1 / memory:1613:16:错误:&#39;指针&#39;声明为指向&#39; Node&amp;&#39;
类型的引用的指针typedef _Tp* pointer; ^
没有错误版本:
class Node {
public:
int nodeId;
vector<Node*> leaves;
bool visited = false;
Node (int id) : nodeId(id){};
};
bool hasRoute(Node* A, Node* B){
if(A->visited == true)
return false;
A->visited = true;
if(A->leaves.size() == 0)
return false;
vector<Node*>::iterator i = A->leaves.begin();
for(; i != A->leaves.end(); ++i) {
if((*i)->nodeId == B->nodeId || hasRoute(*i, B)) {
cout<< (*i)->nodeId << endl;
return true;
}
}
return false;
}