图写成一个类(2)
上次的东西:图写成一个类(第一版)
1 const int maxn=1e4+5, maxm=1e5+5; 2 3 class Graph{ 4 public: 5 //为什么用嵌套类,因为声明很烦。。并不是访问问题的原因。 6 //如果类的成员不是static的话,内部类是不知道获取哪个外部类对象的。。 7 //所以无论是把类放在里面还是外面,访问都有问题。 8 //另外,把private放在下面,应该是因为嵌套类类必须完全声明才能使用吧。。 9 //我也不大清楚。。先这么用着,以后再去翻c++ primer。 10 class Edge{ 11 private: 12 Graph *belong; 13 public: 14 int v, to, next; //感觉这里还是不优雅。。 15 Edge(){} 16 Edge(Graph& g, int x, int y, int z){ 17 belong=&g; 18 to=x, v=y, next=z; 19 } 20 Edge operator ++(){ //不能打引用! 21 *this=belong->edge[next]; //因为有自增运算,这个edge不能等同于图中的! 22 return *this; 23 } 24 int operator *(){ 25 return to; 26 } 27 }; 28 Graph(){} 29 void addedge(int x, int y, int v){ 30 ++cntedge; 31 edge[cntedge]=Edge(*this, y, v, fir[x]); 32 fir[x]=cntedge; 33 return; 34 } 35 Edge get_link(int x){ //这里改成begin较好 36 return edge[fir[x]]; 37 } 38 private: 39 int cntedge, fir[maxn]; 40 Edge edge[maxm]; 41 };
具体思想就是直接用边来做迭代器。。不过因为这个迭代器啊,它有自增运算,所以作为迭代器的边必须重新创造(不然整个图就萎掉了)。
接着还会有第三版的。。感觉c++STL的思想确实值得借鉴。不过感觉这个版本还是不优雅,我会在保证代码简洁易背的的情况下尽可能的让它更优雅。。