迭代器的语法细节?
来源:7-3 相邻结点迭代器
慕移动9586716
2021-04-11
bobo老师您好,c++这门语言我是为了学习您的算法才补的基础语法,对于迭代器还没有学习,所以里面有一些迭代器的语法细节不太懂:
SparseGraph:
1)class adjIterator{
private:
SparseGraph &G; // 图G的引用,这里不是很懂?这里是指将上面的类SparseGraph引入并帮这个类命名为G嘛?
- public:
// 构造函数
adjIterator(SparseGraph &graph, int v): G(graph){ //构造函数里面的形参和G(graph)?
1回答
-
我必须承认这个课程在图这一部分,过于追求代码的“框架性”,导致很多同学理解困难。我应该做一些约束,把这些“非算法部分”的代码的复杂性降下来,让大家更多的关注算法本身。我后来出了一个课程,专门介绍图论算法,对这个问题改进了很多。有兴趣可以关注一下。注意,这个专门的图论课程是使用 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 的一个别名。
继续加油!:)
112021-04-13
相似问题