vector <node&> * leaves vs. vector <node *> leaves </node *> </node&>

时间:2014-10-15 02:30:42

标签: c++ pointers reference

我是来自C#的C ++回归者。那么,请理解这个问题对你来说非常明显。 问题是&#34;为什么不能使用指向矢量的指针?&#34;

什么是正确的或更好的?为了节省一个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;
}

0 个答案:

没有答案