迭代器的型别 《STL 源码剖析》阅读笔记

 应用需求:当我们使用迭代器的时候,可能在函数中返回迭代器,所以要求能够在函数声明的时候就要指明函数的返回类型。这里就可能是迭代器的类型

                     因此我们需要方法获得迭代器的类型。

 C++缺陷:由于C++不支持typeof () 不能在运行时候得到迭代器的型别(迭代器的型别只有就是容器中元素的类型) ,而RTTI(动态运行时)中的TypeID() 只能获得型别的名称

                     ,不能拿来做变量声明之用。

 解决方案1:利用function template 的参数推导机制。

                        如下:

      

template <class I, class T>  
void func_helper(I iter, T t){  
       
     T tmp;    // 这里就是推导出的迭代器所指之物的类型
     ... //这里做func原本该做的工作  
}  
  
template <class I>  
void func(I iter){  
     func_helper(iter, *iter); //*iter作为附加参数  
}  
  
void main(){  
     int i;
     func(&i);  
}  
 

      缺点: 第一,迭代器的型别不只是“迭代器所指对象的型别”,第二,推导出型别不能作为返回值类型

解决方案2:  traits技法-------------把迭代器所指对象(不仅是迭代器所指对象)声明为内部类型。

        如下:

template<class T>
struct  MyIter {
  typedef  T value_type;// 声明为内嵌型别
  T* ptr;
  MyIter (T* p=0):ptr(p){}
  T& operator*() const { return *ptr;}
};

template<class I>
typename I::value_type   //这是函数返回类型(即迭代器所指对象类型)
fun(I ite)
{return *ite; }
MyIter<int> ite(new int(8));
cout<< func(ite); 
                 缺点:并不是所有的迭代器都是class type (类,或者结构体 ,类和结构体内部都可以声明内嵌类型),比如说 int* 类型就不可以定义内部类型。但要适应这种情况                              是必须的

                 改进:偏特化,可以弥补traits技法的不足。

                             普通的内嵌类型如下:

                                         

                 template<class I>
                 struct iterator_traits{
                          typedef  typename I::value_typevalue_type;
                      };
                          对原生指针的偏特化如下:

              template<class I>
                 struct iterator_traits<T*>{
                          typedef  typename I::value_typevalue_type;
                      };
           

 traits 扮演 “特性萃取机”角色,萃取出迭代器相应的型别

                       


STL实现迭代器萃取的方式是通过对iterator_traits进行偏特化。为了使迭代器萃取有效运行,每个迭代器都要自行以内嵌性别定义的方式定义出相应的型别迭代器的类萃取机制被定义为iterator_traits模板类,它接受一个迭代器作为模板参数,并通过特化来提取迭代器的相关信息。 在STL中,对于一般的迭代器,使用iterator_traits模板类进行萃取,通过迭代器内嵌typedef来获取iterator_category、value_type、difference_type、pointer和reference等相应的型别。而针对原生指针类迭代器STL会针对指针类进行偏特化,直接定义出相应的型别,如random_access_iterator_tag、_Tp、ptrdiff_t、_Tp*和_Tp&等。这样就可以实现对迭代器的属性萃取。 通过对iterator_traits进行偏特化,STL能够根据不同的迭代器提取出相应的属性,从而能够在算法中正确地使用不同类迭代器,并根据迭代器的属性进行相应的操作。这样实现了迭代器的通用性和灵活性,使得STL算法可以适用于不同类迭代器。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [STL迭代器---萃取](https://blog.csdn.net/jiewaikexue/article/details/111372288)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [STL 迭代器萃取](https://blog.csdn.net/qq_40080842/article/details/128112675)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值