邻接表图的显示和添加方法

Posted

技术标签:

【中文标题】邻接表图的显示和添加方法【英文标题】:Display and add methods for adjacency list graph 【发布时间】:2018-11-15 19:49:07 【问题描述】:

这是我第三次使用 c++ 中的邻接表创建图形。使用 OOP 很重要。我觉得这个问题的答案很简单,但我无法修复和改进我的代码。

有它:

#include <iostream>
#include <algorithm>
#include <fstream> 
#include <vector>


using namespace std;
struct Edge

    int begin;
    int end;
;

class Graph

private:
    int numOfNodes;
    vector<vector<int>> baseVec;

public:
    Graph(int numOfNodes)
       

        //baseVec->resize(numOfNodes, vector<int>(numOfNodes));
        for (int i = 0; i < numOfNodes; i++)
        
            vector<Edge> subVec;
            baseVec.emplace_back(subVec);
        
    

    void newEdge(Edge edge)
    
        if (edge.begin >= numOfNodes && edge.end >= numOfNodes)
        
            cout << "Invalid edge!\n";
        
        baseVec[edge.begin].emplace_back(edge.end);
        baseVec[edge.end].emplace_back(edge.begin);
    
    void display()
    
        cout << baseVec.size();
        for (int i = 0; i < baseVec.size(); i++)
        
            cout << "\n Adjacency list of vertex " << i << "\n head ";
            for (int j = 0; j < baseVec[i].size(); j++)
            
                cout << baseVec[i][j];
                cout << endl;
            
        
    

;

int main()

    int vertex, numberOfEdges, begin, end;
    cout << "Enter number of nodes: ";
    cin >> vertex;
    numberOfEdges = vertex * (vertex - 1);

    Edge edge;
    Graph g1(vertex);
    for (int i = 0; i < numberOfEdges; i++)
    
        cout << "Enter edge ex.1 2 (-1 -1 to exit): \n";
        cin >> edge.begin >> edge.end;
        if ((begin == -1) && (end == -1))
        
            break;
        
        g1.newEdge(edge);
    
    g1.display();
    return 0;

所以现在在 Visual Studio 中我有一个错误:

'std::vector>::vector(const std::vector<_ty>> &)': 无法将参数 1 从 'std::vector>' 转换为 'const _Alloc & '

另外,在 display() 方法中存在有符号/无符号不匹配。我不知道我的方法是否有问题,但我被困在这里。

【问题讨论】:

半题外话:这里: vector&lt;Edge&gt; subVec; baseVec.emplace_back(subVec); 你为什么使用emplace_backemplace_back 允许您就地创建元素,而不是先创建元素然后复制到容器中。首先创建元素,然后调用emplace_back 使其倒退。如果你想添加n个默认构造元素,你可以简单地调用baseVec.resize(baseVec.size()+n)而不是写循环。 是的,你的方式肯定要好得多。我要改变它和更多的东西。但现在我想知道如何显示边缘...... ***.com/questions/2981836/how-can-i-use-cout-myclass 所以我想我这样重载了运算符: std::ostream &operator 您的越界检查错误:if (edge.begin &gt;= numOfNodes &amp;&amp; edge.end &gt;= numOfNodes) 最后一个有效索引是numOfNodes-1 而不是numOfNodes 【参考方案1】:
vector<vector<int>> baseVec;

接受vector&lt;int&gt;s

vector<Edge> subVec;
baseVec.emplace_back(subVec);

尝试喂它vector&lt;Edge&gt;s。这没有意义。

vector<vector<Edge>> baseVec;

更有意义。

请注意,当

cout << baseVec[i][j];

尝试打印edge,但不知道如何。 make an operator&lt;&lt; overload to handle edge 或更改您输出的内容。

【讨论】:

谢谢!那很有帮助。您对 cout 错误的看法是正确的,我将尝试修复它们。 你认为那段代码会完成创建带边图的任务吗?如果不是我还应该改变什么,我不确定 newEdge 方法。 如果您不确定代码是否有效,请对其进行测试。请注意,即使您确定代码有效,您也应该对其进行测试,以防万一您遇到令人讨厌的惊喜。如有必要,请根据您的测试结果提出一个新问题。

以上是关于邻接表图的显示和添加方法的主要内容,如果未能解决你的问题,请参考以下文章

用数组表示的邻接表,如何添加一个弧

编程实现以邻接表或邻接矩阵为存储结构,图的广度和深度优先搜索

邻接表的简介

图的存储邻接矩阵邻接表十字链表以及邻接多重表相关方法(C语言)

数据结构—图邻接表存储基本运算算法图的遍历

图的基本概念,图的存储--邻接矩阵、邻接表、十字链表、邻接多重表