模拟实现C++迭代器

迭代器的基本概念

       迭代器(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;
}

运行结果:

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值