STL源码剖析-3

2.迭代器(iterators)概念和traits编程技法

STL的中心思想是将containeralgotithmn分离开,独立设计,最后再以胶合剂把他们撮合到一起。

  • 简而言之traits存储着不同迭代器的特性,traits对不同的iterators求结果,通过函数重载,模板等方式,在编译阶段,绑定到正确的方法上去。

1.迭代器

迭代器类型打通的基本方法

  • 不仅仅是指的值,会有常用的五种类型
    • value_type
    • difference_type
    • pointer
    • reference
      • 主要区分类型是否可变,左值OR右值
    • iterator_category
      • 根据支持的操作分为5类
// 方法内部需要使用类型的情况
// 迭代器所指类型(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>
{};
复制代码

2.__type_traits

  • iterator_traits负责萃取迭代器的特性
  • __type_traits是类似iterator_traits的技法,STL将其扩展到了迭代器以外,负责萃取type的特性,主要用于优化构造,析构,拷贝构造和赋值构造
// 定义的两个标志,用作相关方法传参
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++基本类型都是
};

复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值