STL的中心思想是将
container
和algotithmn
分离开,独立设计,最后再以胶合剂把他们撮合到一块儿。c++
迭代器类型打通的基本方法编程
// 方法内部须要使用类型的状况
// 迭代器所指类型(T)的传递,暴露func,具体实如今func_impl中
template<typename I, typename T>
void func_impl(I iter, T t) {
T tmp;
// 略
}
template<typename I>
inline void func(I iter) {
func_impl(iter, *iter);
}
//方法返回值须要使用类型的状况
//能够经过设置统一的声明内嵌类型解决,可是没法应用于原生类型例如指针
//经过特化解决
template<class I> struct iterator_traits { //stl实现的迭代器类,须要声明内嵌类型value_type等
typedef typename I::value_type value_type;
typedef typename I::difference_type difference_type;
typedef typename I::pointer pointer;
typedef typename I::reference reference;
typedef typename I::iterator_category iterator_category;
};
template<typename T>
struct iterator_traits<T*> { // 指针类型特化
typedef T value_type;
typedef ptrdiff_t difference_type; //定义于cstddef头文件
typedef T* pointer;
typedef T& reference;
typedef random_access_iterator_tag iterator_category;
};
template<typename T>
struct iterator_traits<const T*> { // 底层const指针类型特化
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
typedef random_access_iterator_tag iterator_category;
};
// STL源码中的相关特性选择ex:以advance为例,经过iterator_category类型,重载__advance
__advance(i, n, iterator_category(i)); //相关使用
// iterator_category 的实现
template<class I> inline typename iterator_traits<I>::iterator_category iterator_category(const I&) {
typedef typename iterator_traits<I>::iterator_category category;
return category(); // 由于category实际是一个类,实际上由于class 会有继承关系,相关函数参数为父类,则子类无需特化时,无需重复实现,即无需全部函数都实现5个iterator_category重载的版本
}
复制代码
//为了确保全部iterator都实现了5个内嵌类别,STL提供了一个基类
template<typename Category, typename T, typename Distance=ptrdiff_t, typename Pointer=T*, typename Reference=T&>
struct iterator{
typedef Category iterator_category;
typedef T value_type;
typedef Distance difference_type;
typedef Pointer pointer;
typedef Reference reference;
};
template <typename Item>
struct ListIter: public std::iterator<std::forward_iterator_tag, Item>
{};
复制代码
// 定义的两个标志,用做相关方法传参
struct __true_type{};
struct __false_type{};
复制代码
template<class type> struct __type_traits {
typedef __true_type this_dummy_member_must_be_first; //和编译器的一个约定,必须第一个,可是代码逻辑使用不到
typedef __false_type has_trivial_default_constructor;
typedef __false_type has_trivial_copy_constructor;
typedef __false_type has_trivial_assignment_constructor;
typedef __false_type has_trivial_distructor; //前四个对应,是不是能够省略调用的构造函数和析构函数
typedef __false_type is_POD_type; //plainOldData,这些类型没有构造和析构函数,没有虚函数,c++基本类型都是
};
复制代码