如何显示图的邻接列表的元素?
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
的迭代器,因此您的->
访问取消引用了迭代器以获取std::pair
的成员。
@ehudt 的答案通过使用 c++11 range based for
循环来解决这个问题,这样 ->
运算符位于 *Vertex
而不是 list<Vertex*>::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;
【讨论】:
以上是关于如何显示图的邻接列表的元素?的主要内容,如果未能解决你的问题,请参考以下文章