STL的所要做的就是把类型抽象化,把容器和算法分离开,容器(container)负责管理存储,而算法(algorithm)负责抽象的算法,他们之间互不关心。但是他们确实要协作来解决问题,于是迭代器(iterator)作为他们之间的粘合济产生。迭代器类似于一个容器和算法协定好的接口,容器按照接口提供自己所存储的元素,而算法按照接口访问规则来访问元素。
要达到上面的分离traits作了不少贡献。算法中必然要用到真实元素(element)的类型,例如它需要该类型来建立内部变量,需要定义参数或者返回值是该类型的函数等。现在的问题是怎么让算法知道自己操作的真正元素?
方案一:在迭代器中内置一个类型定义(typedef)
template<class T>
class Iterator
{
public:
typedef T value_type;
};
但是原生指针作为一种迭代器确不能在这里奏效,因为原生指针没有内置类型定义。traits萃取机制利用偏特华(patial specialization)很好的解决了这一点。
template<class T>
class iterator_traits
{
public:
typedef T::value_type value_type;
}
template<class T>
class iteraotr_traits<T*>
{
public:
typedef T value_type;
}
实际上STL的SGI实现中为了效率区分类型是否是POD(Plain Old Data)来提高construct,destruct,assignment,copy的效率。
posted on 2006-12-08 13:28
coffee 阅读(143)
评论(0) 编辑 收藏 引用