2011-10-15 54 views
3

我遇到了将条目插入地图的问题。调试地图插入?

#include <stdio.h> 
#include <vector> 
#include <stack> 
#include <map> 

using namespace std; 

class Nodo 
{ 
public: 
    vector<Nodo> Relaciones; 
    int Valor; 
    bool Visitado; 

    Nodo(int V) 
    { 
     Valor = V; 
     Visitado = false; 
    } 
}; 

class Grafo 
{ 
public: 
    Nodo *Raiz; 
    map<int, Nodo> Nodos; 

    Grafo(int V) 
    { 
     Raiz = new Nodo(V); 
     //Getting http://msdn.microsoft.com/en-us/library/s5b150wd(v=VS.100).aspx here 
     Nodos.insert(pair<int, Nodo>(V, Raiz)); 
    } 
}; 

回答

5

您有类型不匹配。您将Nodo*传递给pair构造函数,而它期望Nodo对象。

您声明:

Nodo *Raiz; 

,然后尝试拨打:

pair<int, Nodo>(V, Raiz) 

其预计的intNodo。但你通过它intNodo*

你可能想要的是这样的:

class Grafo 
{ 
    public: 
     Nodo *Raiz; 
     map<int, Nodo*> Nodos; // change to pointer 

     Grafo(int V) 
     { 
      Raiz = new Nodo(V); 
      //Getting http://msdn.microsoft.com/en-us/library/s5b150wd(v=VS.100).aspx here 
      Nodos.insert(pair<int, Nodo*>(V, Raiz)); // change to pointer 
     } 
}; 
+0

嗯,你让我意识到,[以及Mankarse],并增加在Raiz前的*诀窍。我似乎不明白的是,据我所知,去引用(&)操作符应该做它,而不是...为什么会发生这种情况? – Machinarius

+1

'&'是“地址 - ”运算符。 '*'是“取消引用”操作符。 – Mankarse

+1

'&'在这种情况下不起作用,因为它与'Raiz'是'Nodo *'不兼容。 – Mysticial

1

的问题是,Rais是一个指向Nodo,而是你正试图将其插入从int地图以Nodo(而不是从int的地图Nodo*)。

尝试:

class Grafo 
{ 
    public: 
     Nodo *Raiz; 
     map<int, Nodo> Nodos; 

     Grafo(int V) 
     { 
      Raiz = &*Nodos.insert(pair<int, Nodo>(V, Nodo(V))).first; 
     } 
}; 
1

如前所述, '新的' 指针返回到该对象。为了获得对象本身,您需要使用'*'运算符对其进行解引用。这就是地图失效的原因。

此外,如果要插入值到一个地图,我个人认为看起来更清晰的是通过做

typedef map<int, Nodo> MyMap; 
MyMap myawesomemap; 
int V = 5; 
Nodo* Raiz = new Raiz(5); 
myawesomemap.insert(MyMap::value_type(V, (*Raiz))); 
+0

我认为你的解决方案能够工作,而且更清洁,当涉及到Cpp时,我只是一个小小的n00b:p – Machinarius