SGI-STL简记(四)-迭代器解析

stl_iterator_base.h :
    迭代器类型萃取、特性;
    几个特别的迭代器标签tag:input_iterator_tag、output_iterator_tag、forward_iterator_tag、bidirectional_iterator_tag、random_access_iterator_tag;
    其中除了output_iterator_tag独立以外,其他标签tag依次为继承关系(如forward_iterator_tag继承于input_iterator_tag、....),也就意味着前者迭代器类型也可
    使用后者;迭代器标签tag类型于__true_type、__false_type;
    早期用于HP的input_iterator、output_iterator、forward_iterator、bidirectional_iterator、random_access_iterator分别重声明了iterator_category、value_type、
    difference_type、pointer、reference类型,各迭代器的iterator_category(迭代器类别)类型使用了各自的迭代器标签tag, 此外output_iterator比较特别,其他值均为void;
    iterator:迭代器模板类,只是对迭代器类型重声明,很多地方可以直接用到iterator;
    iterator_traits:迭代器特性萃取模板类,其中两个为指针或常指针特化版本,迭代器类型分类为random_access_iterator_tag;
    此外提供了iterator_category、distance_type、value_type,提取迭代器类别、值类型工具模板函数以及宏__ITERATOR_CATEGORY、__DISTANCE_TYPE、__VALUE_TYPE;
    distance:提供多种重载模板函数,以支持不同迭代器类型下前进或计算距离的工具;
    
stl_iterator.h :
    其他各类迭代器;
    back_insert_iterator:后向插入迭代器,相对上面几个迭代器类型增加了重声明container_type容器类型,并含有container容器指针对象;
    构造函数参数为容器指针对象,重载了operator=(其内部调用容器对象的push_back实现后向追加插入),此外重载operator*、operator++、operator++(int)均直接返回
    当前迭代器对象(故back_insert_iterator只能用在支持push_back接口的容器的迭代器,如:vector,deque等,不支持迭代器移动),提供了iterator_category、back_inserter
    以提取当前迭代器所属类型(属于output_iterator_tag类别)和构造当前迭代器对象的模板函数;
    
    front_insert_iterator:前向插入迭代器,同后向插入迭代器类型,不过需要容器提供push_front接口,支持如:vector、deque等;
    
    insert_iterator:插入迭代器,相对前两个迭代器,其构造函数增加了获取容器的迭代器iter且重载的operator=内部采用insert(iter,value)插入某个迭代器前的值并向前调整
    容器内迭代器iter位置;
    
    reverse_bidirectional_iterator:反转双向迭代器,其构造函数为双向迭代器,内部维护迭代器对象current;
    base:获取当前迭代器对象;
    operator*以及operator->:取当前迭代器的前一个位置的迭代器对象;
    operator++、operator--等对应的反向设置当前迭代器对象位置;
    
    reverse_iterator:随机反转迭代器,同reverse_bidirectional_iterator类似,构造函数为随机迭代器,此外重载了operator+=、operator+、operator-=、operator[]等以支持
    随机反向迭代;
    
    istream_iterator:输入流迭代器,除了重声明了常规的类型外还增加了char_type、traits_type、istream_type;其成员有通过构造函数参数basic_istream模板类型对象初始化的_M_stream
    ,_M_value保存流输入的值、_M_ok流对象是否可用,构造函数中调用了_M_read即判断流对象是否可用以及保存输入流数据至_M_value;重载operator*、operator->提取输入流数据;
    operator++、operator++(int):读取输入流数据;
    _M_equal:比较迭代器是否相同,若均不可用则相同,否则再判断流对象是否相同;
    
    ostream_iterator:输出流迭代器,类似于istream_iterator,不过其_M_stream流对象为basic_ostream模板类型,构造函数还提供了一个参数以初始化_M_string作为输出至流时的尾部
    追加插入字符串;此外重载operator=以支持输出至流对象(!未对流对象是否可用进行判断);未重载operator*、operator->;而对于operator++、operator++(int)也仅仅是返回当前输出流迭代器对象;
    
stl_raw_storage_iter.h :
    raw_storage_iterator原始存储迭代器,其为output_iterator_tag类型,构造函数至少为_ForwardIterator类型的迭代器以初始化_M_iter,重载operator*获取当前迭代器对象;
    operator=内部调用construct初始化给定迭代器位置的值并返回当前迭代器对象;operator++、operator++(int)内部执行++_M_iter前向移动迭代器并返回该迭代器对象;
    
部分迭代器用于迭代容器,一部分用于迭代迭代器的迭代器(迭代器包装器);  
若需要自定义容器并与STL兼容使用,则需要实现容器对应的迭代器(即容器才知道迭代器如何迭代遍历自己),并设计对应的迭代器的各型别(即充分利用traits技法和模板参数自动推导的能力);
此外除了自行实现迭代器需要的规范型别外,也可以直接继承std::iterator来实现。另外traits技法除了用在iterator_traits迭代器上,也可以用在type_traits类型型别萃取。

 

posted @ 2019-10-10 12:26  浩月星空  阅读(154)  评论(0编辑  收藏  举报