2017-04-19 8 views
0

私はまだC++を勉強しています。少し助けてください。グラフの隣接リストの要素を表示するにはどうすればいいですか?

struct Vertex 
{ 
    list<Vertex*> adj; 
    string name; 
    Vertex(string str) : name(str) {} 
}; 

class Graph 
{ 
public: 
    typedef map<string, Vertex*> vmap; 
    vmap vm; 
    void AddVertex(const string&); 
    void AddEdge(const string& from, const string& to); 
}; 

私はそれを使用する方法:

Graph g1; 
g1.AddVertex("2"); 
g1.AddVertex("3"); 
g1.AddVertex("4"); 
g1.AddVertex("1"); 
g1.AddEdge("1", "2"); 
g1.AddEdge("1", "3"); 
g1.AddEdge("1", "4"); 

は、今私は単にCOUT頂点とその接続が(場合は、任意の存在する)かどうかを確認するためにしたいのですが、私は以下のグラフの表現を持っていますそれは私が期待しているように働いています。私は、次の方法を試してみましたが、私は完全には理解できないことだし、それを固定することができますかわからないエラーを取得しています:

map<string, Vertex*>::iterator itr = g1.vm.begin(); 
for(itr; itr != g1.vm.end(); itr++) 
{ 
    cout << itr->first << " "; 
    list<Vertex*>::iterator li = itr->second->adj.begin(); 
    for(li; li != itr->second->adj.end(); li++) 
    { 
     cout << li->name << " "; 
    } 
    cout << endl; 
} 

私の質問はどのようにiから頂点名を得ることができるということですそのadjリスト?前もって感謝します!

+0

エラーを投稿できますか? forループの初期化部分( 'for(itr; ...'))には意味がありませんので、その部分を削除してみてください – ehudt

答えて

1

あなたの問題はliは、ポインタのイテレータであることのようですので、あなたはメンバーnameアクセスするための解除参照するためにそれを必要とする:

cout << (*li)->name << " "; 

あなたはトップレベルのイテレータ、itrのためにこれを行う必要はありませんでした理由は、あることstd::pair年代のそのイテレータ、したがって、あなたの->アクセスデ参照メンバーで取得するイテレータstd::pairである。

@ ehudtの答えはc++11 range based forループを使用して->演算子が*Vertexであり、list<Vertex*>::iteratorでないようにすることでこれを解決します。

+0

助けてくれてありがとうございました! – DaniFreecs

0

これを書くための簡単な方法は、次のようになります。

for(const auto& vm_pair : g1.vm) 
{ 
    cout << vm_pair.first << " "; 
    for (const auto& li : vm_pair.second->adj) 
    { 
     cout << li->name << " "; 
    } 
    cout << endl; 
} 
関連する問題