STL Study Day 4: ch4. list, stack, queue, slist
今天,继续学习, 不过收获看起来比前两天要少啊。 对于这章中的stack,queue, slist, 侯捷表现的让我失望啊, 不过, 作为基本知识回顾一下, 还是挺好的。先谈谈List, 这部分写的挺好的, 很清楚, 其中list中的member function, 可以提取出来,充实自己的代码库, 毕竟list 的操作用的太广了, 自己猛然写一下, 出错的概率还是很大的。 闲话不多说了, 来看看list 中transfer的实现, 我是很喜欢这个function的, 逻辑清楚, 表达简单。
这个function所作的是:将一连续范围的elements搬移到指定position的前面, 实现上主要是指针的移动。 其次, 这个函数是list中一些函数的核心, 如splice, sort, merge. 这个函数有如下7个步骤:
输入: position, a range [first, last)
1. last_node->prev->next = position_node
2. first_node->prev->next = last_node
3. position_node->prev->next = first_node
4. tmp_node = position_node->prev
注意:前3步的操作都是: update the "next" field of the previous node of last_node, first_node, and position_node, respectively.
后3步, 那当然就是: update the "prev" field
5. position_node -> prev = last_node->prev
6. last_node-> prev = first_node->prev
7. first_node -> prev = tmp.
还有值得一提的是list自己提供了sort函数, 没有用STL algorithm sort(). 其原因是 sort() 需要 randomAccessIterator. (哦, 侯捷在这里有个拼写错误, p142: RamdonAccessIterator --> RandomAccessIterator). list->sort()核心是qsort(), 今天不研究了, 等看算法的时候, 一并再看。
对于stack, queue, 侯捷没有花很多篇幅讲, 只是简单描述了一下, 不过就其本身来讲, 确实挺简单。 但还是可以多讲讲, 他们的应用。 什么时侯用他们合适, 毕竟现在大多数情况下, 我们并不是没有足够的方法去解决一个问题, 而是我们往往不知道该如何决定一个最佳方案, 这可能更多的是要靠经验的积累。 说多了。
slist 是一个挺奇怪的东西, 从semantic上来说比list简单, 但是从architecture上来说, 又比list复杂。 看了半天, 不知道何时该使用它, 但但为了效率使用它吗?
明天希望把deque看完, 应该不会失望吧。
11:16:14 AM Wednesday, May 13, 2009
补充一下:
为了比较 list 和 slist 的性能, 做了个实验。 不做不知道啊, 原来slist 已经不被ISO C++ 支持了, 现在只能 include <slist.h> , 而不是 include <slist>.
测试了一下 insert 的时间
1000 | 10000 | 100000 | 1000000 | 10000000 | |
list | 0.255973 ms | 1.68788 ms | 16.6021 ms | 163.434 ms | 1705.28 ms |
slist | 1.54889 ms | 153.791 ms | 42899.8 ms |
当insert 次数大于10000时, slist 就表现的很差劲了, 不过这是由于slist并没有提供backward interator 的操作, 可以理解。 本来还想测一下, slist.insert_after(), 不过, 发现每次调用这个函数, 竟然会有segment fault, 算了, 也不去管它, 毕竟ISO C++ 都不支持它了, 以后也不会用它。
2:53:03 PM Wednesday, May 13, 2009