迭代器的定义: 提供一种方法,使之能够巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式
STL的中心思想是将容器和算法分开,然后用迭代器将两者联系起来
//以find为例子
template
InputIterator find(InputIterator first,InputIterator last,const T& value){
while(first!=last&&*first!=value)
++first;
return first;
}
下面附上一个使用迭代器的例子
#include
#include
#include
#include
#include
using namespace std;
int main(){
const int arraySize=7;
int ia[arraySize]={0,1,2,3,4,5,6};
vectorivect(ia,ia+arraySize);
listilist(ia,ia+arraySize);
dequeideque(ia,ia+arraySize);
vector::iterator it1=find(ivect.begin(),ivect.end(),4);
if(it1==ivect.end())
cout<<"4 not found"<::iterator it2=find(ilist.begin(),ilist.end(),6);
if(it2==ilist.end()){
cout<<"6 not found"<::iterator it3=find(ideque.begin(),ideque.end(),8);
if(it3==ideque.end())
cout<<"8 not found"<
//给与不同的迭代器 find()测试
//原生指针 auto_ptr
void func(){
auto_ptrps(new string("jjhou"));//以算式new动态分配一个初值为"jjhou" 并将所得的结果作为auto_ptr的初值
cout<<*ps<size()<
迭代器所指对象的型别,称为该迭代器的value type .但是这个value type不可用于函数的返回值.函数的"template参数推到机制"推导的只是参数,无法推导函数的返回值型别
于是我们使用函数的声明内嵌
template
struct MyITer{
typedef T value_type;//内嵌说明
T* ptr;
MyIter(T *p=0):ptr(p){}
T& operator*()const{return *ptr;}
};
template
template I::value_type//这一行是func的返回值类别
func(I ite){
return *ite;
}
MyIterite(new int(8));
cout<
注意,func()的返回类别必须加上关键字typename,因为T是一个template类别的参数,在被编译器具体化之前,编译器不了解T的信息,用template的用意是在告诉编译器这是一个型别,这样才能通过编译
当遇见原生指针的时候,这种做法就会出现问题 于是引入了偏特化
用来萃取迭代器的特性
template
struct iterator_traits{
typedef typename I::value_type value_type;
};
萃取出来的value_type就是I::value_type.
那么原先的的func函数就可以这样写
template
typename iterator_traits::value_type//这一整行是函数返回类别
func(I ite)
{
return *ite;
}