迭代器

迭代器的定义: 提供一种方法,使之能够巡访某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表达方式
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;
}

你可能感兴趣的:(stl)