迭代器的语法细节?

来源:7-3 相邻结点迭代器

慕移动9586716

2021-04-11

bobo老师您好,c++这门语言我是为了学习您的算法才补的基础语法,对于迭代器还没有学习,所以里面有一些迭代器的语法细节不太懂:

SparseGraph:

1)class adjIterator{
private:
SparseGraph &G; // 图G的引用,这里不是很懂?这里是指将上面的类SparseGraph引入并帮这个类命名为G嘛?

  1. public:
    // 构造函数
    adjIterator(SparseGraph &graph, int v): G(graph){ //构造函数里面的形参和G(graph)?
写回答

1回答

liuyubobobo

2021-04-12

我必须承认这个课程在图这一部分,过于追求代码的“框架性”,导致很多同学理解困难。我应该做一些约束,把这些“非算法部分”的代码的复杂性降下来,让大家更多的关注算法本身。我后来出了一个课程,专门介绍图论算法,对这个问题改进了很多。有兴趣可以关注一下。注意,这个专门的图论课程是使用 java 讲解的:https://coding.imooc.com/class/370.html


回到你的问题:


1


通过这里 27 行的调用,你可能理解的更清楚:https://git.imooc.com/coding-71/coding-71/src/master/07-Graph-Basics/Course%20Code%20%28C++%29/03-Vertex%20Adjacent%20Iterator/main.cpp


简单来说就是,这个迭代器需要能访问一个图,这个图在这个迭代器里,被叫做 G。


但是,从性能的角度,我们不希望存放整个图的副本,所以不是 SparseGraph G,引用相当于直接读取相应的内存空间,而不是创建一个副本。


深聊 C++ 中的引用还是一个挺复杂的话题,但如果只是从理解我们的代码在做什么的角度,我觉得这个解释已经够了。


2


: G(graph) 的写法被称为是构造函数初始化列表。


你可以简单理解成,这是对 this->G = graph 的简单写法。但实际上不完全是简单写一下,但是从功能上是这个意思,就是让引用 G 指向的是传来的 graph 对应的内存空间。从此,这个迭代器里的变量 G,可以看作是外面 graph 的一个别名。


继续加油!:)

1
1
慕移动9586716
嗯嗯,看了老师的解答自己又回去看了几遍代码,理解了,谢谢老师
2021-04-13
共1条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程