SGI-STL简记-迭代器解析
Posted haomiao
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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前向移动迭代器并返回该迭代器对象; 部分迭代器用于迭代容器,一部分用于迭代迭代器的迭代器(迭代器包装器);
以上是关于SGI-STL简记-迭代器解析的主要内容,如果未能解决你的问题,请参考以下文章