C++ stl迭代器的理解

首先,stl采用了泛型编程,分成了容器和算法,容器和算法之间的桥梁是迭代器,迭代器的作用是可以让算法不区分容器来作用在数据上。

迭代器本质上是指针,原有类型(比如int,double等)的指针也可以是迭代器,那如何让代码区分开他们呢?

我们可以把自定义的迭代器包装成一个对象,原有类型的还是指针,使用偏特化就可以区分开自定义迭代器和原有类型指针。可以这么干

cpp 复制代码
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。

这是一篇小笔记,怕忘了,随手记录

相关推荐
Hical_W13 分钟前
深入学习CPP17_PMR
c++·学习
xiaoshuaishuai829 分钟前
C# 实现百度搜索算法逆向
开发语言·windows·c#·dubbo
yuan1999731 分钟前
使用模糊逻辑算法进行路径规划(MATLAB实现)
开发语言·算法·matlab
计算机安禾1 小时前
【数据结构与算法】第42篇:并查集(Disjoint Set Union)
c语言·数据结构·c++·算法·链表·排序算法·深度优先
蒸汽求职1 小时前
北美求职身份过渡:Day 1 CPT 的合规红线与安全入职指南
开发语言·人工智能·安全·pdf·github·开源协议
YuanDaima20481 小时前
二分查找基础原理与题目说明
开发语言·数据结构·人工智能·笔记·python·算法
fox_lht1 小时前
7.3.结构体-方法
开发语言·后端·rust
chenbin___1 小时前
检查hooks依赖的工具(转自千问)
开发语言·前端·javascript·react native·react.js
久爱@勿忘2 小时前
vue/uniapp H5页面截图
开发语言·前端·javascript
2301_800976932 小时前
python的协程
开发语言·python