c++ - C++ Graph类指针困惑

标签 c++ pointers graph

我正在尝试建立一个图类,其中图由邻接表表示。图本身是指针的 vector ,其中每个指针都指向节点的链接列表。无论出于何种原因,当我使用打印图形功能时,程序都不会输出任何内容。谁能告诉我我做错了什么,也许我对指针的误解在哪里?提前致谢!

#include <array>
#include <vector>
#include <tuple>
#include <unordered_map>

class Node
{
    public:

    int vertex;
    int value;
    Node* next;

    Node(int ver)
    {
        vertex = ver;
    };
};

class Graph
{
    public:

    int n_nodes;
    std::unordered_map<int,Node*> graph;
    
    Graph(int n)
    {   
        n_nodes = n;
        for(int i=0;i<n;i++)
        {
            graph.insert({i,nullptr});
        };
    };

    void add_edge(int src,int des,int val)
    {
        Node node_des = Node(des);
        node_des.value = val;
        node_des.next = graph[src];
        graph[src] = &node_des;

        Node node_src = Node(src);
        node_src.value = val;
        node_src.next = graph[des];
        graph[des] = &node_src;
    };

    void print_graph()
    {
        for(int i =0; i<n_nodes;i++)
        {
            std::string str = "Head "+std::to_string(i);
            Node node = *graph[i];
            while (&node != nullptr)
            {
                str=str+" -> "+std::to_string(node.vertex);
                node = *(node.next);
            };

            std::cout<<str<<std::endl;
        };
    };
};

int main()
{
    Graph g = Graph(6);
    g.add_edge(0,1,3);
    g.add_edge(2,1,4);
    g.add_edge(0,4,1);
    g.add_edge(4,5,6);
    g.add_edge(5,3,2);
    g.add_edge(4,3,3);
    g.add_edge(3,2,5);
    g.add_edge(4,1,1);
    g.add_edge(3,1,2);

    g.print_graph();
    return 0;
}```

最佳答案

如果可能的话,您可以只使用vector的vector而不是链表,而不使用指针。由于内存缓存在 vector 操作中的某些插入可能比链表更快,因此结构如下:

struct Node2 {
    int vertex; 
    int value;
};

struct Edge2 {
    int src, des, value;
};

struct Graph2 {
    int n_nodes;
    std::vector<std::vector<Node2>> graph; 

    void add_edge(Edge2 edge) {
        graph[edge.src].emplace_back(edge.des, edge.value);
        graph[edge.des].emplace_back(edge.src, edge.value);
    }

    void add_edge(std::initializer_list<Edge2> edges)
    {
        std::for_each(edges.begin(), edges.end(), [this](auto &e) { add_edge(e); });
    };
}
最终比链接列表更容易,更快捷;
https://quick-bench.com/q/cmX2-2IYA873TR4qn5aV4ijjUQo

关于c++ - C++ Graph类指针困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62853175/

相关文章:

c++ - Boost::file_system:检查错误代码

c++ - 使用指针初始化数组,然后从中读回数据。

c++ - boost::graph同构的使用

python - igraph的gomory_hu_tree计算最小割树吗?

c++ - 为什么我们需要在运行时使用函数指针调用这些函数。我们也可以直接调用他们

c++ - 指针和内存泄漏

c++ - 在 C++ 中将项目添加到列表

c - 以下代码在C语言中的输出是什么?

c# - SortedSet.Remove() 不删除任何东西

c++ - 为什么互斥锁不需要互斥锁(而那个互斥锁需要互斥锁...)