记录一个对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;
}