我正在尝试为有向图编写一个类,其功能非常简单,例如添加和删除边。由于某种原因,默认复制构造函数不起作用,我想知道为什么。
main.cpp中:
#include <iostream>
#include "Graph.h"
using namespace std;
int main()
{
Graph g1(1);
g1.insertEdge(0, 0);
Graph g2(g1);
cout << (g1 == g2) << endl; // false
return 0;
}
Graph.h:
#ifndef GRAPH_H_INCLUDE
#define GRAPH_H_INCLUDE
#include <vector>
class Graph
{
public:
typedef unsigned int vertex_t;
typedef std::vector< std::vector<bool> > edges_set_t;
vertex_t vertices;
edges_set_t edges;
Graph(vertex_t vertices = 0)
: vertices(vertices)
{
initEdges();
}
void insertEdge(vertex_t v, vertex_t w)
{
edges[v][w] = 1;
}
bool hasEdge(vertex_t v, vertex_t w) const
{
return edges[v][w];
}
private:
void initEdges()
{
edges = std::vector< std::vector<bool> >(vertices);
while (edges.size() < vertices)
edges.push_back(std::vector<bool>(vertices));
}
};
bool operator==(const Graph& g, const Graph& h)
{
if (g.vertices != h.vertices)
return false;
for (Graph::vertex_t v = 0; v < g.vertices; ++v)
for (Graph::vertex_t w = 0; w < g.vertices; ++w)
if ((g.hasEdge(v, w) && !h.hasEdge(v, w)) || (!g.hasEdge(v, w) && h.hasEdge(v, w)))
return false;
return true;
}
#endif
在我的main函数中,我创建了一个带有单个顶点的图形,并在其上添加了一个自循环。然后我尝试使用默认的复制构造函数复制它,它以某种方式给我一个顶点正确但没有边缘的图形。
如果我使用这个构造函数,情况也是如此:
Graph(const Graph& other)
{
vertices = other.vertices;
initEdges();
edges = other.edges;
}
但是,它可以正常使用,由于某些原因我找不到:
Graph(const Graph& other)
{
vertices = other.vertices;
initEdges();
for (Graph::vertex_t v = 0; v < vertices; ++v) // no idea why a manual implementation is necessary
for (Graph::vertex_t w = 0; w < vertices; ++w)
if (other.hasEdge(v, w))
insertEdge(v, w);
}
答案 0 :(得分:2)
此循环
SimpleIoC
永远不会进入,因为您调用的构造函数为向量的每个元素添加了空向量。要确保获得方阵,请使用
while (edges.size() < vertices)
可以将其移至edges = std::vector< std::vector<bool> >(vertices, std::vector<bool>(vertices));
的成员初始化列表中,无需呈现Graph
。
此外,您可以删除initEdges()
变量,因为它始终等于vertices
。
您的比较运算符执行此操作:
edges.size()
条件相当于
if ((g.hasEdge(v, w) && !h.hasEdge(v, w)) || (!g.hasEdge(v, w) && h.hasEdge(v, w)))
由于if (g.hasEdge(v, w) != h.hasEdge(v, w))
提供比较大小的std::vector
,您可以按如下方式重写比较运算符:
operator ==