首页 > 学院 > 开发设计 > 正文

对std::vector/list的iterator简单包装尝试

2019-11-11 05:25:00
字体:
来源:转载
供稿:网友

记录一个对iterator的定义尝试:

1. 使用typename定义直接推导最简单

2. 使用iterator的基础类型比较麻烦(使用allocator、std::iterator基础定义),需要再深入看下stl源码解析。

#include <vector>#include <list>#include <iostream>template <typename _Tp>class PackIntsVector{public:    // 赋值走copy构造     PackIntsVector(const std::vector<_Tp>& vec)    {        m_vecInts = vec;    };        // vector::iterator实现     // 方法一:遍历类型指定: std::forward_iterator_tag,iterator的原始结构体类型:不支持++, --, !=等操作     // typedef std::iterator<std::forward_iterator_tag, _Tp, __int64, _Tp*, _Tp&> iterator;    // 方法二:分配类型指定:std::allocator<_Tp>, 并包装iterator, 提供++,--,!=等方法     // 指定分配类型:std::allocator<_Tp>    // typedef typename __gnu_cxx::__alloc_traits< std::allocator<_Tp> >::template rebind<_Tp>::other _Tp_alloc_type;    typedef typename std::allocator<_Tp> _Tp_alloc_type;    // 获取元素指针类型     // typedef typename __gnu_cxx::__alloc_traits<_Tp_alloc_type>::pointer pointer;    typedef typename _Tp_alloc_type::pointer pointer;    // 初始化iterator,提供了*, ->, !=, +=, -= 等方法     typedef __gnu_cxx::__normal_iterator<pointer, std::vector<_Tp> > iterator;        // 方法三:等效于下面这句话 (注意,必须有typename关键字说明,用于告诉编译器推导)     // typedef typename std::vector<_Tp>::iterator iterator;        iterator begin()    {        return m_vecInts.begin();    };            iterator end()    {        return m_vecInts.end();    };        // list::iterator实现    // 方法一:     typedef typename std::_List_iterator<_Tp> iteratorLst;        // 方法二:     //typedef typename std::list<_Tp>::iterator iteratorLst;        iteratorLst beginLst()    {        return m_lstInts.begin();    };    iteratorLst endLst()    {        return m_lstInts.begin();    };PRivate:    std::vector<_Tp> m_vecInts;    std::list<_Tp> m_lstInts;};int main(){    std::vector<int> vecInts;    for (int i=0; i<10; ++i)    {        vecInts.push_back(i);    }        PackIntsVector<int> pack = vecInts;    for (PackIntsVector<int>::iterator iter = pack.begin(); iter != pack.end(); ++iter)    {        std::cout << *iter << std::endl;    }    for (PackIntsVector<int>::iteratorLst iter = pack.beginLst(); iter != pack.endLst(); ++iter)    {        std::cout << *iter << std::endl;    }    return 1;}


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表