Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
2年前关闭。
因此,我将一个包含元组的图形类放在一起,每个元组包含两个从source.txt中获取的整数,以及一个printGraph函数,但是我尝试在驱动程序中使用它,但不输出任何内容。我的文本文件在正确的位置,并且我确定我以正确的方式插入了整数和元组,但是我不确定。我认为这与我设置打印功能及其实现方式有关。如果有人能指出我做错了什么,也许是可能的解决方案,我将非常感激。谢谢
这是我的图类
如果您还有其他信息,请询问,我将编辑我的问题。谢谢。
想改善这个问题吗? Update the question,所以它是on-topic,用于堆栈溢出。
2年前关闭。
因此,我将一个包含元组的图形类放在一起,每个元组包含两个从source.txt中获取的整数,以及一个printGraph函数,但是我尝试在驱动程序中使用它,但不输出任何内容。我的文本文件在正确的位置,并且我确定我以正确的方式插入了整数和元组,但是我不确定。我认为这与我设置打印功能及其实现方式有关。如果有人能指出我做错了什么,也许是可能的解决方案,我将非常感激。谢谢
void printGraph(Graph t) {
map<int, Vertex*> vertices = t.getVertices();
for (map<int, Vertex*>::iterator it = vertices.begin(); it != vertices.end(); ++it) {
cout << it->first << ": ";
vector<Edge *> edges = it->second->getEdges();
for (vector<Edge *>::iterator jit = edges.begin(); jit != edges.end(); ++jit) {
int l1 = (*jit)->getV1()->getLabel();
int l2 = (*jit)->getV2()->getLabel();
if (l1 != it->first) { cout << l1 << ", "; }
if (l2 != it->first) { cout << l2 << ", "; }
}
cout << endl;
}
}
const int numberStreets = 10 ;
int main()
{
std::ifstream infile("source.txt");
tuple<int, int> streets[numberStreets];
int a, b;
if (!infile) {
cout << "File not found" << endl;
system("pause");
return 1;
}
int i = 0;
while (infile >> a >> b)
{
streets[i] = make_tuple(a, b);
i++;
}
Graph city(numberStreets);
for (int i = 0; i < numberStreets; i++)
{
city.addEdge(get<0>(streets[i]), get<1>(streets[i]));
}
printGraph(city);
system("pause");
return 0;
}
这是我的图类
class Graph {
vector<Edge*> edges;
map<int, Vertex*> vertices;
public:
Graph(const int){}
Vertex * addVertex(int label) {
Vertex * v = new Vertex(label);
vertices[label] = v;
return v;
}
map<int, Vertex*> getVertices() { return vertices; }
vector<Edge*> getEdges() { return edges; }
Edge * addEdge(int from, int to) {
if (vertices.find(from) != vertices.end() && vertices.find(to) != vertices.end()) {
Vertex * vfrom = vertices.find(from)->second;
Vertex * vto = vertices.find(to)->second;
Edge * e = new Edge(vfrom, vto);
(*vfrom).addEdge(e);
edges.push_back(e);
return e;
}
else {
return 0;
}
}
Edge * getEdge(int from, int to) {
if (vertices.find(from) != vertices.end() && vertices.find(to) != vertices.end()) {
Vertex * v1 = vertices.find(from)->second;
Vertex* v2 = vertices.find(to)->second;
Edge * e = (*v1).getEdgeTo(to);
return e;
}
else {
return 0;
}
}
void removeEdge(int from, int to) {
Edge * e = getEdge(from, to);
if (e != 0) {
edges.erase(remove(edges.begin(), edges.end(), e), edges.end());
(*e).getV1()->removeEdge(e);
}
}
Vertex * getVertexWithLabel(int l) {
if (vertices.find(l) != vertices.end())
return vertices.find(l)->second;
else
return 0;
}
void removeVertex(int l) {
Vertex * v = getVertexWithLabel(l);
if (v != 0) {
vector<Edge *> edges = getVertexWithLabel(l)->getEdges();
for (vector<Edge *>::iterator it = edges.begin(); it != edges.end(); ++it) {
int from = (*it)->getV1()->getLabel();
int to = (*it)->getV2()->getLabel();
removeEdge(from, to);
}
vertices.erase(l);
}
else {
}
}
};
如果您还有其他信息,请询问,我将编辑我的问题。谢谢。
最佳答案
我注意到的第一个问题是,仅调用addEdge
,而从未调用addVertex
。因此,无论何时调用addEdge
,vertices.find(from)
和vertices.find(to)
都将返回vertices.end()
(因为顶点不存在)。
我建议采取以下步骤:
调试对addEdge
的调用,以查看发生了什么。 (或者,至少检查返回值,无论如何这都是一个好习惯。)您会注意到我描述的问题。
放入对addVertex
的调用,然后再次调试对addVertex
和addEdge
的调用,以确保这一次确实构建了图形。 (即使printGraph
现在可以工作,也要进行调试,以确保它按照您的想法进行。)
N.B .:正如我说的,这只是我注意到的第一个问题,因此,我不保证在添加addVertex
调用后,它将起作用。
关于c++ - C++如何打印图表? ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47740234/
10-11 15:51