这是我看了《STL源码剖析》之后的一些个人的看法,因为要消化某一个东西,最好的方法就是写下自己的看法和理解。再经过时间的积累,就会慢慢积累到你对真正意义的掌握。这是我的第一个比较正式一点学习笔记,以前也有一些,但都比较零散,其中这段时间对STL比较着迷,也希望得到高手的指点,因为我现在对于ALLOCATOR和adapter还不是很理解,我自己也写过一些仿allocator和adapter,但还不太清楚,有时就是自己写得出也未必了解得透。特别是adapter,我对本源的使用意义和用处还不很理解。希望大家给我指点。欢迎所有STL高手和新手们来指点我。学无止境!!!
笔记一:对于算法、仿函数、配接器的一些看法:
一、算法:
就是一组模板函数。根据我们所要操作的目的进行操作OK了。其实我们在看STL时经常看到 template< class InputIterator,class OutputIterator> sub(…){….}等等,以为InputIterator或是OutputIterator是某个固定的类型,其实这是STL标准和约定而已,你可以写成template< class T1, class T2> sub(…){….},其实这些都是约定的东西而已,也就是说如果你不想去符合STL标准,不是进行STL标准库扩充,你根本不要在意这些约定的写法。我们要关注的应该是在函数里面的应该要求进来的迭代器提供什么行为功能,也就是迭代器是否应该具有operator++,operator--,operator+,operator-,operator(),operator*,operator->等等自然指针的行为。因为我们在算法函数里面进行的这些操作符的运算,看起来很简单,其实有可能就要用到迭代器的行为。比如:
Template< class T1, class T2>
T2 sum_among( T1 first, T1 last, T2 init)
{
For ( ; first != last; first++ )
Init += *first;
Return init;
}
我这个算法也可以放在STL标准库里头作为统计在两个迭代器之间的元素的个数,类似的如accumulate
Template <class InputIterator, class T >
T accumulate ( InputIterator first, InputIterator last, T init )
{
For ( ; first != last; first++ )
Init += *first;
Return init;
}
这两个函数一样的功能,不同的一点是第二个写得让人能够清楚的读懂罢了。在这里面重要的是一个要用这个函数的人应该记得:
1、你的InputIterator类迭代器应该具有!=,++,*这三个指针行为。否则你使用起来错误一大把。
2、作为T类型的变量(或是对象)也应该具有+=之类的行为能力。比如我们使用
vector<int> v(3,3);
int s;
s = accumulate( v.being(), v.end(), s ); //结果应该是9
3、在整个调用过程中间,对于init的使用,有两次传值过程,也就是copy_in和copy_out。这是STL的重要特征之一。对于这种小型的变量,一般要采用copy_value传递方法,避免引用时出错。因为最重要的一点,我们的STL有强大的iterator。