矢量向量未正确复制(C ++)

时间:2016-09-01 14:19:14

标签: c++ vector graph

我正在尝试为有向图编写一个类,其功能非常简单,例如添加和删除边。由于某种原因,默认复制构造函数不起作用,我想知道为什么。

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);
}

1 个答案:

答案 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 ==

Demo.