如何显示图的邻接列表的元素?

Posted

技术标签:

【中文标题】如何显示图的邻接列表的元素?【英文标题】:How to display the elements of a graph's adjacency list? 【发布时间】:2017-04-19 19:23:23 【问题描述】:

我还在学习 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");

现在我想简单地计算顶点及其连接(如果存在)以检查它是否按预期工作。我尝试了以下方法,但出现了一个我不完全理解且不知道如何修复的错误:

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;

我的问题是如何从该 adj 列表中获取顶点名称?提前谢谢!

【问题讨论】:

你能发布错误吗?在 for 循环的初始化部分(for(itr; ...),itr 没有任何意义。尝试删除它作为开始。 【参考方案1】:

您的问题似乎是 li 是指针的迭代器,因此您需要取消引用它才能访问成员 name

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

您不需要为***迭代器itr 执行此操作的原因是它是std::pair 的迭代器,因此您的-&gt; 访问取消引用了迭代器以获取std::pair的成员。

@ehudt 的答案通过使用 c++11 range based for 循环来解决这个问题,这样 -&gt; 运算符位于 *Vertex 而不是 list&lt;Vertex*&gt;::iterator

【讨论】:

感谢您的帮助和解释,这就是问题所在!【参考方案2】:

更简单的写法是:

for(const auto& vm_pair : g1.vm)

    cout << vm_pair.first << " ";
    for (const auto& li : vm_pair.second->adj)
    
        cout << li->name << " ";
    
    cout << endl;

【讨论】:

以上是关于如何显示图的邻接列表的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何在输入元素“上方”显示下拉列表

如何检查列表中的任何一个元素是不是显示在量角器中

如何在xml中显示列表的最后一个元素?

如何在模板中显示具有外键关系的元素?

如何在input元素下显示搜索结果列表?

如何在复选框中显示数组元素 - 离子