邻接表图的显示和添加方法
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<Edge> subVec; baseVec.emplace_back(subVec);
你为什么使用emplace_back
? emplace_back
允许您就地创建元素,而不是先创建元素然后复制到容器中。首先创建元素,然后调用emplace_back
使其倒退。如果你想添加n个默认构造元素,你可以简单地调用baseVec.resize(baseVec.size()+n)
而不是写循环。
是的,你的方式肯定要好得多。我要改变它和更多的东西。但现在我想知道如何显示边缘......
***.com/questions/2981836/how-can-i-use-cout-myclass
所以我想我这样重载了运算符: std::ostream &operator
您的越界检查错误:if (edge.begin >= numOfNodes && edge.end >= numOfNodes)
最后一个有效索引是numOfNodes-1
而不是numOfNodes
【参考方案1】:
vector<vector<int>> baseVec;
接受vector<int>
s
vector<Edge> subVec;
baseVec.emplace_back(subVec);
尝试喂它vector<Edge>
s。这没有意义。
vector<vector<Edge>> baseVec;
更有意义。
请注意,当
cout << baseVec[i][j];
尝试打印edge
,但不知道如何。 make an operator<<
overload to handle edge
或更改您输出的内容。
【讨论】:
谢谢!那很有帮助。您对 cout 错误的看法是正确的,我将尝试修复它们。 你认为那段代码会完成创建带边图的任务吗?如果不是我还应该改变什么,我不确定 newEdge 方法。 如果您不确定代码是否有效,请对其进行测试。请注意,即使您确定代码有效,您也应该对其进行测试,以防万一您遇到令人讨厌的惊喜。如有必要,请根据您的测试结果提出一个新问题。以上是关于邻接表图的显示和添加方法的主要内容,如果未能解决你的问题,请参考以下文章
编程实现以邻接表或邻接矩阵为存储结构,图的广度和深度优先搜索