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

How to display the elements of a graph's adjacency list?

本文关键字:列表 元素 图形 何显示 显示      更新时间:2023-10-16

我仍在学习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;
}

我的问题是如何从该调整列表中获取顶点名称?预先感谢您!

您的问题似乎是 li是指指的迭代器,因此您需要将其删除以访问成员name

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

您不需要为您的顶级迭代器itr执行此操作的原因是它是std::pair'S的迭代器,因此您的->访问权限访问了迭代器,以获取std::pair成员。

@ehudt的答案通过使用基于C 11范围的for循环解决此问题,以便->操作员在*Vertex上,而不是list<Vertex*>::iterator

撰写本文的一种更简单的方法是:

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