STL迭代器
日期:2014-06-26 18:49:12
最后更新日期:2014-06-27 09:48:32
迭代器是为配合访问容器设计的,而不需要知道容器内部的具体实现,更好一点的说法,是用一种统一的接口去访问不同的容器。对于其内部实现,服务端应用不应该隐藏细节的,由于一些原因,导致一些公司,禁止其项目内部使用STL。在看《STL源码剖析》时,看到迭代器这一节。当然,是为了弄清楚容器的内存管理而看,随意翻到迭代器。我发现,我之前理解不了迭代器,我不理解的事,多了去了。现在,感觉转变一下,理解变得容易多了。当你尝试去理解一样的东西时,要先接受它,而不是一上来就带有挑刺的眼光来看,那么你会发现很多地方,都有带刺。工作后变好了,没有那么多时间去挑刺,卷起袖子用。好了,不扯犊了。下面这段代码摘抄《STL源码剖析》。 [code lang="cpp"]
#include<iostream>
#include<memory>
using namespace std;
template<class T>
struct MyIter{
typedef T value_type;
T* ptr;
MyIter(T* p=0):ptr(p){}
T& operator*(){ return *ptr; }
};
//返回值为迭代器iter中的value类型
template<class I>
typename I::value_type fun(I iter)
{
return *iter;
}
int main()
{
auto_ptr<int> ptr(new int(8));
MyIter<int> iter(ptr.get());
cout<<fun(iter)<<endl;
}
[/code]
结果为8,看到iter就和迭代器的行为类似。
迭代器是放在容器里面的,而我们只需知道迭代器的用法就可以了。将上诉函数包装在容器内,就是容器内部函数怎么通过迭代器的萃取type用法。我们知道在STL的容器中,指针也可以被看成为迭代器,其实就是将类模板偏特化了。如上诉迭代器iter要支持为int*的形式,那么这样写:
[code lang="cpp"]
#include<iostream>
#include<memory>
using namespace std;
template<class T>
struct MyIter{
typedef T value_type;
T* ptr;
MyIter(T* p=0):ptr(p){}
T& operator*(){ return *ptr; }
};
//用这个结构提取迭代器的value类型
template<class I>
struct my_iterator_traits{
typedef typename I::value_type value_type;
};
//指针也被看成是迭代器,提取指针所指向的类型
template<class I>
struct my_iterator_traits<I*>{
typedef I value_type;
};
template<class I>
typename my_iterator_traits< I >::value_type fun(I iter)
{
return *iter;
}
int main()
{
auto_ptr<int> ptr(new int(8));
MyIter<int> iter(ptr.get());
cout<<fun(iter)<<endl;
cout<<fun(ptr.get())<<endl;
}
[/code]
结果打印两个8。
PS:
开始将my_iterator_traits写为与STL冲突的iterator_traits的。导致编译一直不过,又没有发现原因。