2017-04-19 51 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; 
} 
相关问题