关于typename Graph
来源:7-5 深度优先遍历和联通分量
weixin_慕设计6333414
2021-06-03
这里实在是不明白为什么这么写,Graph具体指什么?什么是成员变量,什么是类型?不应该先include"SparseGraph",然后再SparseGraph::adjIterator吗?
1回答
-
liuyubobobo
2021-06-04
Graph 是这个类的泛型,用户在调用的时候,可以传来 SparseGraph,也可以传来 DenseGraph。
Graph 的声明在 14 行:https://git.imooc.com/coding-71/coding-71/src/master/07-Graph-Basics/Course%20Code%20%28C++%29/05-DFS-and-Components/Components.h
对 Component 类的创建,在16,21,30,35 行,尖括号里的类会成为 Component 类中的 Graph:https://git.imooc.com/coding-71/coding-71/src/master/07-Graph-Basics/Course%20Code%20%28C++%29/05-DFS-and-Components/main.cpp
typename Graph::adjIterator adj(G, v);
中,类别是:typename Graph::adjIterator,变量名称是 adj,创建 adj 要的两个参数是 G 和 v。
为什么这样写?因为通过这个方式,这个类即兼容 SparseGraph,又兼容 DenseGraph。用户处理的图如果是稀疏图,创建 Components 的对象的时候,就用 SparseGraph;用户处理的图如果是稠密图,创建 Components 的对象的时候,就用 DenseGraph。
如果使用 SparseGraph::adjIterator 的方式,相当于把这个类写死了,只能用于 SparseGraph 了。
不过在这里,如果对这个语法不适应,你完全可以写死,让 Components 类只兼容 SparseGraph。这不影响对算法的理解。实际上,我也发现我在这里的代码由于过于追求工程上的高复用性,反而由于使用的语法太复杂,把一些同学绕晕了,忽视了算法的学习。对于这个课程的学习,还是主要要关注算法,语言方面是次要的。模板本来就是 C++ 语言中比较难理解的一部分,这一部分也不是这个课程的重点。可以参考这里:https://coding.imooc.com/learn/questiondetail/vZ85pzYG9Rk6n0rV.html
我后续在出专门的图论课程之后,吸取了这个教训,在代码上更注重算法本身,而一定程度忽视了工程型。如果感兴趣可以参考这里(这个课程是使用 Java 讲解的):https://coding.imooc.com/class/370.html
继续加油!:)
20