迭代器的基本概念
迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。迭代器修改了常规指针的接口,所谓迭代器是一种概念上的抽象:那些行为上像迭代器的东西都可以叫做迭代器。然而迭代器有很多不同的能力,它可以把抽象容器和通用算法有机的统一起来。迭代器基本分为五种,输入输出迭代器,前向逆向迭代器,双向迭代器和随机迭代器。
如果想要细致的了解有关于迭代器的实现原理,推荐一本书《STL源码剖析》第3章,里面较为详细的讲解了有关于迭代器的实现原理。今天就分享一下基本的迭代器实现原理。迭代器其本质就是类似于指针,只不过是一种面向对象的指针,所以其设计思想就是将迭代器封装成了一个类。在类中对运算符进行重载,包括 != 、++ 、-- 、- 。其中的++ 和 -- 均为前置的++ 和前置的 --。
又因为迭代器是依赖于容器的,所以我们还需要再实现一个简单的容器,也是将其封装成一个类,其中提供了基本容器中的方法:begin() 、end() 、 push_back() 、show() 。
template Iterator
template<typename T>
class Vector;
template<typename T>
class Iterator
{
public:
//构造函数
Iterator(Vector<T>* pv, int idx)
:pvec(pv), index(idx)
{}
bool operator!=(const Iterator left)
{
return index != left.index;
}
T& operator *() const;
const Iterator operator++(int)
{
const Iterator tmp(*this);
index++;
return tmp;
}
const Iterator operator--(int)
{
const Iterator tmp(*this);
index--;
return tmp;
}
const Iterator operator-(int left)
{
return Iterator(pvec, index - left);
}
private:
Vector<T> *pvec; //容器对象
int index; //下标值
};
template<typename T>
T & Iterator<T>::operator*() const
{
return (*pvec)[index];
}
template vector
template<typename T>
class Vector
{
public:
typedef Iterator<T> iterator;
Vector()
{
parr = new T[2]();
cursize = 0;
totalsize = 2;
}
iterator begin()
{
return iterator(this, 0);
}
iterator end()
{
return iterator(this, cursize);
}
void push_back(T data)
{
insert(end(), data);
}
void insert(iterator position, T data)
{
if (full())
{
resize();
}
for (iterator it = end(); it != position; it--)
{
*it = *(it - 1);
}
*position = data;
cursize++;
}
~Vector()
{
delete[] parr;
parr = NULL;
}
void resize()
{
T * newspace = new T[totalsize * 2];
memcpy(newspace, parr, sizeof(T)*totalsize);
delete[] parr;
parr = newspace;
totalsize *= 2;
}
void Show()
{
for (int i = 0; i < cursize; i++)
{
std::cout << parr[i] << " ";
}
std::cout << std::endl;
}
T& operator[](int index)
{
return parr[index];
}
private :
bool full()
{
return cursize == totalsize;
}
T * parr;
int cursize;//当前元素的个数
int totalsize;//总元素的个数
};
main test
int main()
{
Vector<int> vec;//模板实例化
for (int i = 0; i < 10; i++)
{
vec.push_back(i + 1);
}
vec.Show();
return 0;
}