STL源码分析之二—迭代器

来源:互联网 发布:剑灵捏脸数据天族女 编辑:程序博客网 时间:2024/05/15 01:14
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....


0 0
原创粉丝点击