STL中,设计适当的相应类型是迭代器的责任。而设计适当的迭代器则是容器的责任。
迭代器的相应类型有以下几种:
1.value_type 迭代器所指对象的类型
2.difference_type 迭代器的差值的类型
3.reference_type 迭代器的*操作的类型
4.pointer_type 迭代器的->操作的类型
5.iterator_type 迭代器本身所属类型(只读,只写,前向,双向,随机访问)
在设计迭代器的相应类型的过程中,一个很重要的技术就是 traits 编程方式。
traits 的工作方式就像一台萃取机,萃取出迭代器的各个特性。其具体使用如下例:
#include <iostream>
#include <vector>
using namespace std;
template<typename Iter>
void func(Iter iter)
{
iterator_traits<Iter>::value_type i = *iter;
cout << i << endl;
}
int main()
{
vector<int> vec = {1,2,3};
vector<int>::iterator it = vec.begin();
func(it);
}
//此处不用注明 typename iterator_traits<Iter>::value_type
//因为 iterator_traits中已经声明typename
// template<class I>
// struct iterator_traits{typedef typename I::value_type value_type;};
traits 的使用了内嵌类型声明与模板类型推导来实现将迭代器指向类型导出。例如:普通内置类型的指针所指对象的萃取的实现:
template<class T>
struct iterator_traits<T*> //局部特化,指定此时模板类型为普通指针类型
{
typedef T value_type;
};
在 SGI STL 中,迭代器萃取机的代码如下(针对迭代器类型):
template<class Iter>
struct iterator_traits
{
typedef typename Iter::value_type value_type;
typedef typename Iter::difference_type difference_type;
typedef typename Iter;:pointer pointer;
typedef typename Iter::reference reference;
typedef typename Iter::iterator_category iterator_category;
};
在C++ 中,指针也支持迭代器的大部分操作,因此,迭代器萃取机对内置指针也进行了部分特化:
template<class T>
struct iterator_traits<T *>
{
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
typdef random_access_iterator_tag iterator_category; //迭代器的类型有五种,分别是:input,output,forward,bidirectional,ranndon access
}