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
用来表示两个迭代器之间的距离,因此它可以表示一个容器的最大容量,如STL的count(),返回值就必须使用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....