今晚用vector<int>::iterator写了合并排序算法,受尽“折磨”。在实现merge(vecotor<int>::iterator, vector<int>::iterator, vector<int>::iterator)时,我传入了待排序vector<int>对象的三个迭代器,然而在函数里面又需要再定义一个vector<int>类型的局部对象。在数组下标“概念”的影响下,我自然地将比较个对象的迭代器,因为使用数组时我们是这样做。但是,出现恐怖的“警告框”,意味着要从库文件的代码中查找错误。不过,在经验的指导下和框中间的一行断言,我们可以大概推断出错误所在。可能太依赖vs2008中断点跟踪功能。我不可思索地插入断点,没在意那一句重要的“断言”。因为对迭代器的实现理解不足,在跟踪过程中,监视迭代器对象时出现不能接受的值,如end()的结果竟会是个绝对值很大的负数,对它进行解引用时临时提示“不能识别操作”……以前在用数组时从未出现的现象发生了,而我去依赖于vs,没有考虑代码,跟踪过程中,脑海没有联想过代码,似乎在做机械的按“F5, shift+F5, F10, F11”操作。快想放弃,留着以后来解决的时,我一不小心,进入merge函数,然后又恰巧地跟踪迭代器比较的那行代码中跳出我警告框。这时恍然大悟了。
有以下教训:
1,不能用数组类似地对待vector<int>,两者的区别不仅仅是前者没有成员函数而后者有。它们是没有半血缘关系的陌生人。
2, 迭代器的某此操作有点像下标,但不能与下标归入同一路货色。接下来看了《深度探索C++对象模型》可能会理解得更好。
3,调试先问自己要断点设哪,要监视哪些变量,监视的变量的值应该是多少,哪一行的代码会导致错误
4,只会插入断点和F10、F11是没办法成为一流程序员的。如果可以根据运行结果直接思考出debug在哪发生并修改正确的话,那是最好,
也是应该的吧,因为自己写的代码,自己肯定很熟,哪里有毛病会很快探测出来。
5, 脑子跟着CPU跑代码,这是必须的,也是重要的。如果编程功力也像武侠小说里面说的有第几层境界说法的话,那能跑越多行代码,
说明境界越高,特别是在递归函数。
吸取教训,继续思考着前进,在编程的道路上走得更远。