我还在学习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;
}
我的问题是如何从该调整列表中获取顶点名称?提前谢谢!
答案 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;
}