STL源码分析之二—迭代器

本文探讨了STL中的Traits编程技巧,详细解释了迭代器的value_type、difference_type、reference_type、pointer_type和iterator_category等关键概念,并介绍了不同类型的迭代器,如Input、Output、Forward、Bidirectional和Random Access迭代器的特点与使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STL源码分析之二—迭代器

1.Traits编程技巧:

 

Traits编程技法大量运用在STL实现品中,它利用“内嵌型别”的编程技巧与编译器的template参数推导功能,增强C++未能提供的关于型别认证方面的能力,弥补C++不为强型别语言的遗憾,

例:

Template <class T>

Struct MyIter

{

Typedef T value_type;

T*ptr;

MyIter(T* p = 0):ptr(p){}

T& operator*() const{return *ptr;}

};

 

Template <class T>

Typename I::value_type

Func(I ite)

{

Return *ite;

}

 

Myiter<int> ite(new int(8));

Cout<<func(ite);

 

注意:func()的返回值必须加上关键词typename,因为T是一个template参数,在他被编译器具体现化之前,编译器对T一无所知;换句话说,编译器并不知道MyIter<T>::value_type代表的是一个型别还是一个member function 或是一个data member。关键词typename的用意就是在告诉编译器这是一个型别,这样才能通过编译。

2. 

迭代器相应型别之一:valule type

指迭代器所指对象的型别。任何一个打算和STL算法有完美搭配的class,都应该定义自己的value type内嵌类型。

迭代器型别二:difference type

用来表示两个迭代器之间的距离,因此它可以表示一个容器的最大容量,如STLcount(),返回值就必须使用difference type

 

 

template <class InputIterator, class T>

typename iterator_traits<InputIterator>::difference_type

count(InputIterator first, InputIterator last, const T& value) {

  typename iterator_traits<InputIterator>::difference_type n = 0;

  for ( ; first != last; ++first)

    if (*first == value)

      ++n;

  return n;

}

 

迭代器型别三:reference type

 

迭代器型别四:pointer type

 

迭代器型别五:iterator_category

 

3.迭代器分类:

Input iterator :这种迭代器所指对象,不允许外界改变,只读。

Output iterator:只写。

Forward iterator :允许“写入型”算法,(replace())在此种迭代器所形成的区间上进行读写操作。(允许operator++)

Bidirectional iterator :可双向移动,(允许operator++ 也可以operator--)

 

Random Access iterator:包含所有的指针算数能力,包括p+n, p-n,p[n],p1-p2.p1<p2....


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值