如何打印指针vector实现的图结构并解决相关C++编译报错问题
报错原因
你定义的graph是vector<DirectedGraphNode*>类型,容器内存储的元素是指向DirectedGraphNode的指针,对应的迭代器iter_pt的operator->返回值就是DirectedGraphNode*类型,而非结构体本身。
你直接写iter_pt->label相当于要访问DirectedGraphNode*指针的label成员,而指针本身没有该成员,因此触发编译错误。访问iter_pt->neighbors、iter_neighbor_pt->label的报错逻辑完全一致,都是少了一层对指针的解引用。
正确实现方式
基于原有迭代器写法的修正
只需要对迭代器解引用得到指针后,再用->访问结构体成员即可,修正后的打印代码如下:
/*********** start print ************/ //print vertex node vector<DirectedGraphNode*>::iterator iter_pt; for (iter_pt=graph.begin(); iter_pt<graph.end(); iter_pt++) { // 先解迭代器得到Node*,再用->访问结构体成员 cout << (*iter_pt) -> label << ": "; //print the neighbor nodes of each vertex vector<DirectedGraphNode*>::iterator iter_neighbor_pt; // 同样先解迭代器得到Node*,再取neighbors成员 for (iter_neighbor_pt = ((*iter_pt) -> neighbors).begin(); iter_neighbor_pt < ((*iter_pt) -> neighbors).end(); iter_neighbor_pt++) { // 内层迭代器同理,多一层解引用 cout << (*iter_neighbor_pt) -> label; } cout << "\n"; }
C++11 更简洁的范围for写法
可以避免迭代器解引用的易错问题,代码可读性更高:
/*********** start print ************/ for (auto node : graph) { cout << node->label << ": "; for (auto neighbor : node->neighbors) { cout << neighbor->label; } cout << "\n"; }
两种写法都可以得到你期望的输出:
1: 2 2:
内容的提问来源于stack exchange,提问作者zurich_ruby
相关产品推荐
相关产品推荐

