首先,stl采用了泛型编程,分成了容器和算法,容器和算法之间的桥梁是迭代器,迭代器的作用是可以让算法不区分容器来作用在数据上。
迭代器本质上是指针,原有类型(比如int,double等)的指针也可以是迭代器,那如何让代码区分开他们呢?
我们可以把自定义的迭代器包装成一个对象,原有类型的还是指针,使用偏特化就可以区分开自定义迭代器和原有类型指针。可以这么干
template<typename T>
class myIterator{
public:
using value_type = T;
myIterator(T* iter) : ptr(iter){}
T& operator*(){
return *ptr;
}
public:
T* ptr;
};
template<typename Iterator>
struct myIterator_traits{
using value_type = typename Iterator::value_type;
};
template<typename Iterator>
struct myIterator_traits<Iterator*>{
using value_type = Iterator;
};
template<typename Iterator>
struct myIterator_traits<const Iterator*>{
using value_type = Iterator;
};
template<typename T>
typename myIterator_traits<T>::value_type func(T begin){
typedef typename myIterator_traits<T>::value_type return_type;
return_type res=*begin;
return res;
}
int main(){
myIterator<int> a(new int(10));
cout<<func(a)<<endl;
int* b=new int(5);
cout<<func(b)<<endl;
const int* c=new int(1);
cout<<func(c)<<endl;
return 0;
}
这样借用偏特化使用内嵌类型就得到了传入的类型,也叫萃取。
如果不使用萃取,也就是myIterator_traits这个结构,是无法解决传入类型为int*这种的,因为int可没有value_type。文章来源:https://www.toymoban.com/news/detail-609645.html
这是一篇小笔记,怕忘了,随手记录文章来源地址https://www.toymoban.com/news/detail-609645.html
到了这里,关于C++ stl迭代器的理解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!