【问题标题】: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 没有任何意义。尝试删除它作为开始。

标签: c++ list stl


【解决方案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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多