【问题标题】:Debugging map insertion?调试地图插入?
【发布时间】:2011-12-08 05:10:03
【问题描述】:

我在将条目插入地图时遇到问题。

#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));
    }
};

【问题讨论】:

    标签: c++ map insert insertion


    【解决方案1】:

    您的类型不匹配。您将 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
            }
    };
    

    【讨论】:

    • 嗯,你让我意识到 [以及 Mankarse],在 Raiz 前面添加 * 就可以了。我似乎不明白的是,据我所知,取消引用(&)运算符应该这样做......为什么会发生这种情况?
    • &amp; 是“地址”运算符。 * 是“取消引用”运算符。
    • &amp; 在这种情况下不起作用,因为它仍然与 Nodo* 不兼容,这就是 Raiz 的含义。
    【解决方案2】:

    问题在于Rais 是指向Nodo 的指针,但您正试图将其插入从intNodo 的映射(不是从intNodo* 的映射)。

    试试:

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

    【讨论】:

      【解决方案3】:

      如前所述,'new' 返回一个指向对象的指针。为了获取对象本身,您需要使用“*”运算符取消引用它。这就是地图无法工作的原因。

      此外,如果您想将值插入到地图中,我个人认为这样做看起来更清晰

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

      【讨论】:

      • 我认为你的解决方案确实有效,而且它更干净,我只是在 Cpp 方面有点 n00b :p
      猜你喜欢
      • 2019-05-12
      • 1970-01-01
      • 2013-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      相关资源
      最近更新 更多