1,静态常量整数成员在class内部可以直接初始化。
2,STL迭代器前闭后开区间 [) 的设计,遍历的时候直接:
for( first; first != last; first++)
使用 != ,而不是 < 或 >,好处元素之间无需占有连续的内存空间。
3,vs下的stl空间配置器在头文件<xmomory>中。
空间配置分为两个阶段:
申请时候:申请内存区域(_Allocate函数,调用::operator new),调用构造函数(_Allocate函数)
释放时候:调用析构函数()_Destroy,释放内存区域(直接调用::operator delete)
::operator new类似于malloc,不同于new,前者不会调用构造函数,后者会调用。
4,为了设计容器的迭代器,必须对该容器的实现细节有丰富的了解,所以设计容器的同时设计该容器迭代器,对于使用者起到封装作用。
5,型别的萃取:
C++支持sizeof,
RTTI性质中的typeid,
function template的参数推导argument deduction机制
version 1:
函数参数推导机制只能推导函数的参数类型,无法推导函数的返回值型别。
version 2:
要求所有的迭代器必须有一个value_type类型定义。陷阱~
version 3:
使用trait技术结合模板偏特化template partial specialization
约定:STL的每一种迭代器必须自行以内嵌型别定义(nested typedef)的方式定义出相应型别(associated types)。
6,算法:问题之解法也~
算法的泛化鬼过程:抽象出模式pattern
参见泛化技术:
http://www.generic-programming.org/languages/cpp/techniques.php
http://www.boost.org/community/generic_programming.html
STL中算法在#include <functional>, #include <algorithm>, #include <numeric>
7,copy函数:
连续内存拷贝,
离散随机内存拷贝,
用户自定义类型:编译器非智能地判定其具有non-trivial assignment operator
基本数据类型,具有trivial assignment operator
first, last迭代器指向源内存起始位置,result迭代器指向目标内存
// 随机内存拷贝 : 每次比较迭代器判断循环是否结束,慢~
for (; first!=last; result++, first++)
*result = *first; //调用赋值操作符
// 连续内存,通过距离n判断循环是否结束,快~
_copy_d(first, last, result)
for( distance n = last-first; n>0; --n, ++result, ++first )
*result = *first; //调用赋值操作符
// 对于特化版本:基本数据类型指针指向的连续内存区,使用memmove函数优化
template<T>
inline T* __copy_t(const T* first, const T* last, T* result) {
memmove( result, first, sizeof(T) * (last-first) );
return result + (last - first);
}