我在C++中的邻接图有几个问题。我修复了一些主要错误,但仍然可以运行和测试程序。我不确定newEdge()
方法是否正常工作,向量中的向量是否正确创建,最重要的是如何显示图形中的边。
这是代码,我用“!”标记了错误的行:
#include <iostream>
#include <algorithm>
#include <fstream>
#include <vector>
using namespace std;
struct Edge
{
int begin;
int end;
};
class Graph
{
private:
int numOfNodes;
vector<vector<Edge>> baseVec;
public:
Graph(int numOfNodes)
{
baseVec.resize(baseVec.size() + numOfNodes);
}
void newEdge(Edge edge)
{
if (edge.begin >= numOfNodes-1 || edge.end >= numOfNodes-1 || edge.begin < 0 || edge.end < 0)
{
cout << "Invalid edge!\n";
}
baseVec[edge.begin].emplace_back(edge.end); !!
baseVec[edge.end].emplace_back(edge.begin); !!
}
void display()
{
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;
}
}
}
};
std::ostream &operator<<(std::ostream &os, Edge const &m)
{
return os << m.begin << m.end;
}
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中遇到的两个错误是:
'|':有符号/无符号不匹配
二进制'〈':找不到接受类型为“_Ty”的右操作数的运算符(或者没有可接受的转换)
这是一个新版本of my prior question。
1条答案
按热度按时间wsxa1bj11#
我假设你的
Graph
是一个基于你的程序逻辑的具有固定数量节点的无向图的模型。你的程序有不少问题。
首先,成员函数
Graph::newEdge
中,前置条件错误,应该是的
更重要的是,如果前置条件失败,
newEdge
函数应该立即返回,而不是添加边。第二个问题是构造函数
Graph::Graph
,1)私有成员变量numOfNodes
没有初始化。2)不需要调用baseVec.resize()
,可以直接创建给定大小的vector。3)首选成员初始化列表。第三个问题与成员变量
Graph::baseVec
有关。假设你有一个4个节点的图,其中边按以下顺序插入:(0,1),(0,2),(0,3),(1,2),(2,3)。过程应该是,
步骤1:(0,1)
步骤2:(0,2)
步骤3:(0,3)
步骤4:(1,2)
步骤5:(2,3)
baseVec中存储的不是
Edge
类型,而是int
。源是行索引,目标是列索引。这样,struct Edge
的输出操作符就不必要了。最后,在
main
函数中,numOfEdges
上的赋值是不必要的。我猜你的逻辑是图上的最大边数是vertex * (vertex - 1)
,但newEdge
成员函数不检查重复边。你必须修改成员函数,使其有用。查看wandbox.上的完整演示