C++ 迭代器实现
迭代器的作用就是提供一个遍历容器内部所有元素的接口,因此迭代器的内部必须保存一个与容器相关联的指针,然后重载各种运算操作来方便遍历
其中最重要的就是* 运算符和-> 运算符,以及++、--等可能需要的运算符重载。
实际上这和C++标准库的智能指针(smart pointer)很像,智能指针也是将一个指针封装,然后通过引用计数或是其他方法完成自动释放内存的功能,为了达到和原有指针一样的功能,也需要对*、->等运算符进行重载。
vecIter主要作用就是包裹一个指针,不同容器内部数据结构不相同,因此迭代器操作符重载的实现也会不同。比如++操作符。对于线性分配内存的数组来说,直接对指针执行++操作即可; 但是如果容器是List就需要采用元素内部的方法,比如ptr->next()之类的方法访问下一个元素。因此,STL容器都实现了自己的专属迭代器。
下面我们给出一个普通数组的迭代器的实现(array_iterator.cpp):
#include <iostream>
#include <numeric>
template<class Item>
class vecIter{
Item *ptr;
public:
typedef std::forward_iterator_tag iterator_category;
typedef Item value_type;
typedef Item *pointer;
typedef Item &reference;
typedef std::ptrdiff_t difference_type;
public:
vecIter(Item *p = 0):ptr(p){}
Item & operator*() const{
return *ptr;
}
Item * operator->() const{
return ptr;
}
//pre
vecIter &operator++(){
++ptr;
return *this;
}
vecIter operator++(int){
vecIter tmp = *this;
++*this;
return tmp;
}
bool operator==(const vecIter &iter){
return ptr == iter.ptr;
}
bool operator!=(const vecIter &iter){
return !(*this == iter);
}
};
int main(int argc, char *argv[])
{
int a[] = {1,2,3,4};
std::cout<<std::accumulate(vecIter<int>(a), vecIter<int>(a+4), 0)<<std::endl;
return 0x0;
}