【问题标题】:Debugging vector retrieval?调试向量检索?
【发布时间】:2011-10-15 20:23:20
【问题描述】:

这几乎是 debugging a map insertion 的后续,我应用了那里指出的建议,但现在需要更多指针,我对此感到非常困惑:

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

    Nodo()
    {
        Visitado = false;
    }
};

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

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

    void Insertar(int _1, int _2)
    {
        Nodo *Fuente = Nodos[_1];
        Nodo *Destino = new Nodo(_2);
        Nodos.insert(pair<int, Nodo>(_2, Destino));
        Fuente->Relaciones.push_back(Destino);
        Destino->Relaciones.push_back(Fuente);
    }

    pair<int, Nodo> Resultado;
    void DFS(Nodo Fuente)
    {
        stack<pair<int, Nodo>> St;
        St.push(pair<int, Nodo>(0, Fuente));
        Fuente.Visitado = true;
        while(!St.empty())
        {
            pair<int, Nodo> P = St.top();
            int Dist = P.first;
            Nodo N = P.second;
            St.pop();
            if(Dist < Resultado.first)
            {
                Resultado.first = Dist;
                Resultado.second = N;
            }
            for(int i = 0; i < N.Relaciones.size(); i++)
            {
                //Getting error C2664: 'Nodo::Nodo(int)' : cannot convert parameter 1 from 'Nodo *' to 'int' here
                Nodo *I = N.Relaciones[i];
                if(!I->Visitado)
                {
                    I->Visitado = true;
                    St.push(pair<int, Nodo>(Dist + 1, I));
                }
            }
        }
    }

    int Procesar()
    {
        DFS(*Raiz);
        Resultado.first = 0;
        DFS(Resultado.second);
        return Resultado.first;
    }
};

int main()
{
    Grafo* G;
    int Nodos = 0;
    scanf("%d", &Nodos);
    int _1, _2 = 0;
    scanf("%d", &_1);
    scanf("%d", &_2);
    G = new Grafo(_1);
    G->Insertar(_1, _2);
    Nodos--;
    while(Nodos - 1 > 0)
    {
        scanf("%d", &_1);
        scanf("%d", &_2);
        G->Insertar(_1, _2);
        Nodos--;
    }
    printf("%d" + G->Procesar());
    system("PAUSE");
}

它不应该按原样工作吗?我将I 声明为指向Nodo 的指针,而[] 运算符旨在给我一个Nodo 指针。

如果它很重要,我正在使用为无字符集配置的 Visual Studio 2011。

【问题讨论】:

    标签: c++ pointers vector


    【解决方案1】:

    由于地图使用的是指针,所以需要插入一对带指针的,全部改

    pair<int, Nodo>
    

    pair<int, Nodo*>
    

    【讨论】:

    • 即使我确实犯了那个错误,但这并不是编译错误的原因......这完全是另外一回事,我错过了将 Nodo 插入 DFS 堆栈的解引用运算符
    【解决方案2】:

    我发现 Insertar 存在一些问题...

        void Insertar(int _1, int _2)
        {
            Nodo *Fuente = Nodos[_1];
            Nodo *Destino = new Nodo(_2);
            Nodos.insert(pair<int, Nodo>(_2, Destino));
            Fuente->Relaciones.push_back(Destino);
            Destino->Relaciones.push_back(Fuente);
        }
    

    1) Nodos[_1] 不是查找与键 _1 关联的条目的方法,因为如果一个条目不存在,它将在您的地图中创建一个条目。请使用 map::find()。

    2) pair 的插入被传递一个 Nodo*。这是不正确的。

    我只看了这个函数。我确定还有其他问题。

    【讨论】:

    • 第 1 点应该不是问题,因为地图中始终存在密钥 第 2 点已解决,谢谢
    • @Drknezz - 关于第 1 点,在当前 main() 函数及其用法中确实如此,但就可以在其他地方使用的类的设计而言,不能保证有人将调用带有 arg 1 的 Insertar 引用先前添加到图中的节点。通常,您应该在 rhs 上使用 map 的 operator[],而无需事先确认该键的条目存在。恕我直言
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多