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

时间:2017-04-19 19:23:24

标签: c++ list stl

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

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

2 个答案:

答案 0 :(得分:1)

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

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

您不需要为顶级迭代器itr执行此操作的原因是它是std::pair的迭代器,因此您的{{ 1}}访问取消引用迭代器以获取->的成员。

@ ehudt的答案通过使用c++11 range based for循环解决了这个问题,因此std::pair运算符位于->而不是*Vertex

答案 1 :(得分: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;
}