2017-04-19 27 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; 
} 

我的問題是,怎樣才能從頂點名字那個形容詞?先謝謝你!

+0

你能發佈錯誤嗎? 在for循環的初始化部分('for(itr; ...'),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; 
} 
相關問題