2017-05-30 8 views
-1

Vertexクラスの変数distを更新しようとしています。 Vertexオブジェクトは、Graphクラス(vertices)のunordered_mapの値に保持されます。 私が抱えている問題は、g.get_vertex(vert).set_distance(34)(ここではgは、グラフオブジェクトで、の値ペアがその頂点オブジェクトを保持する頂点名です)でdist変数を変更しようとすると、何も変更されません。例えば 私はC++でクラスの変数を変更できません

g.get_vertex(vert).set_distance(34); 
cout << g.get_vertex(vert).get_distance() 

を行う場合(10000000はデフォルトコンストラクタでdistの値として定義した)10000000の代わりに、34を与えます。

#include <iostream> 
#include <unordered_map> 
#include <vector> 
using namespace std; 

class Vertex{  
public: 
    int dist ; 
    unordered_map <int,int> connected_to ; 

    Vertex(){ 
     connected_to; 
     dist=10000000; 
    } 

    void add_neighbour(int x, int y){ 
     connected_to[x] = y; 
    } 
    void set_distance(int d){ 
     dist = d; 
    } 
    int get_neighbour(int x){ 
     return connected_to[x]; 
    } 
    int get_distance(){ 
     return dist; 
    } 
    unordered_map <int,int> get_connections(){ 
     return connected_to; 
    }  
}; 

class Graph{  
    unordered_map <int , Vertex > vertices; int vert_num; 
public:  
    Graph(){ 
     vertices; 
     vert_num=0; 
    } 
    void add_vertex(int x){ 
     Vertex New_vert; 
     vertices[x] = New_vert; 
     vert_num+=1; 
    } 
    void add_edge(int x, int y , int dist){ 
     if (vertices.find(x) == vertices.end()){ 
      add_vertex(x); 
     } 
     if (vertices.find(y) == vertices.end()){ 
      add_vertex(y); 
     } 
     Vertex vert ; 
     vert.add_neighbour(y, dist); 
     Vertex vert2 ; 
     vert2.add_neighbour(x, dist); 
    } 
    Vertex get_vertex(int x){ 
     return vertices[x]; 
    } 
    unordered_map<int , Vertex> get_vertices(){ 
     return vertices; 
    } 
    int get_num(){ 
     return vert_num; 
    } 
}; 
+2

あなたのコンストラクタ本体は間違っているわけではありませんが、無駄な表現は、クラスメンバーを初期化する構文が非常に間違っていることを示唆しています。 –

答えて

3

get_vertex値で返しますので、あなたは効果的vertices内の要素のコピーを変更しています。あなたはget_vertices()get_connections()ため

Vertex& getVertex(int x) 

simiarを期待している動作を取得するために参照することによって返します。

0

この関数は、一時的なオブジェクトが死亡したときにこれらの変更が失われ、コレクション

Vertex get_vertex(int x) 
{ 
    return vertices[x]; 
} 

からコピーした新しいVertexインスタンスを返します。

1

このコードには多くの問題があります。不完全なリストは次のとおりです。

  1. int vert_numは、単にコンストラクタが必要とされていないstd::unordered_map<>::size()
  2. を使用し、不要である(デフォルトを生成されます)
  3. あなたは、多くの場合、

    void add_edge(int x, int y , int dist){ 
        if (vertices.find(x) == vertices.end()){ 
         add_vertex(x); 
        } 
        if (vertices.find(y) == vertices.end()){ 
         add_vertex(y); 
        } 
        Vertex vert ;     // automatic/temporary object 
        vert.add_neighbour(y, dist);  // modify the object 
        Vertex vert2 ;     
        vert2.add_neighbour(x, dist); 
                // end of scope: temporaries are destroyed 
    } 
    

    、例えば、一時的なオブジェクトを変更しています最後の4行のコードは何もしません(最適化されているかもしれません)。あなたはおそらく行うことを意図して

    void add_edge(int x, int y , int dist){ 
        vertices[x].add_neighbour(y, dist); 
        vertices[y].add_neighbour(x, dist); 
    } 
    

    (非が与えられたキーのために発見された場合unordered_map<>::operator[]は新しい要素を挿入することに注意)でした。あなたは

    Vertex get_vertex(int x){ 
        return vertices[x]; 
    } 
    unordered_map<int,Vertex> get_vertices(){ 
        return vertices; 
    } 
    

    g.get_vertex(vert).set_distance(34); 
    

    のようなコードにGraphに格納されている実際のVertexには影響を与えませんその修正にコピーを返す

  4. 。代わりに、あなたは

    Vertex&get_vertex(int x){ 
        return vertices[x]; 
    } 
    Vertex const&get_vertex(int x) const { 
        auto find=vertices.find(x); 
        if(find==vertices.end()) 
         throw std::runtime_error("unknown vertex requested"); 
        return find->second; 
    } 
    unordered_map<int,Vertex>&get_vertices(){ 
        return vertices; 
    } 
    unordered_map<int,Vertex> const&get_vertices() const{ 
        return vertices; 
    } 
    

    間違いなくかかわらず、あなたはverticesマップ(class Graphによって対処されなければならないことを必要とするあらゆる機能)を公開してはならないはずです。

+0

すべての問題を指摘してくれてありがとう!私はまだ初心者です。 –

関連する問題