1

これはすでに書かれている問題であることは理解しており、いくつかの説明に従いましたが、まだうまくいかないようです。検索中に見落とした説明があるか、少し間違ったことをしている可能性があります。

グラフを作成し、あるグラフから別のグラフにデータをコピーしようとしています。これだけ効きます。しかし、私はそれらを別々にするのに苦労しています。

graph_maker temp_graph;
temp_graph = kruskal_graph;
for(unsigned int j = 0; j < min_edges.size(); j++){
    temp_graph.add_undirected_edge(min_edges[j].node1, min_edges[j].node2, min_edges[j].edge_dist);
    if(check_cycle(temp_graph) == true)
        temp_graph = kruskal_graph;
    else
        kruskal_graph = temp_graph;
}

temp_graphandはkruskal_graphと同じ型graph_makerです。関数を実行するadd_undirected_edge()と、両方のオブジェクトにエッジが追加されます。それらを別々に保つために、graph_makerクラスの代入演算子をオーバーロードしようとしました:

    graphmaker& operator=(const graphmaker& Other)
    {
      v_map = Other.v_map;
      return *this;
    }

これv_mapは、必要なデータを含む構造です。私も次のことを試しました:

    graphmaker& operator=(graphmaker other)
    {
        using std::swap;
        swap(v_map, other.v_map);
        return *this;
    }

しかし、これらの手法はどちらも、2 つのオブジェクトを分離したままにはしていません。両方について、エッジを追加すると、for ループの後の最初の行の両方に追加されます。単純な間違いを犯しているように感じますが、その理由を見つけるのに苦労しています.

ご意見ありがとうございます。

編集:

struct vertex
{
        vector <pair<float,vertex*>> adj; //cost of edge, destination vertex
        string name;
        vertex(string s){
            name=s;
        }
};

class graphmaker
{
    public:
        /*
        graphmaker& operator=(graphmaker other)
        {
            using std::swap;
            swap(v_map, other.v_map);
            // repeat for other member variables;
            return *this;
        }*/

        graphmaker& operator=(const graphmaker& Other)
        {
          v_map = Other.v_map;
          return *this;
        }

        //typedef map<string, vertex *> map;
        map<string, vertex *> v_map;
        void add_vertex(const string&);
        void add_directed_edge(const string& from, const string& to, float cost);
        void add_undirected_edge(const string& node1, const string& node2, float cost);
        void make_graph(const string& name);
};
4

1 に答える 1

1

動的に割り当てられた要素を含む複雑なデータ構造をディープ コピーするには、すべての動的メンバーを で初期化newし、それらを分離しておく必要があります。したがって、いくつかのノード (頂点) ポインターがある場合は、それらをnew新しいオブジェクト用に初期化する必要があります。

于 2013-07-16T07:48:38.850 に答える