动态数组迭代器vector

动态数组迭代器
知识点:
动态数组(根据存入数据的多少自动扩容的数组);
迭代器[注:动态数组在进行删除和插入的时候尾部迭代器可能会失效]
代码上已经附上注释!
关于动态数组后面会仔细写一篇文章!
C++提供的这几个库里面都有标准的迭代器:
#include // C++字符串库
#include // C++ 列表库
#include // C++ 动态数组库
#include // C++ 字典库 有序
代码

#include <iostream>
/// <summary>
/// 动态数组迭代器
/// </summary>
namespace
{
	//typedef void* Vode;
	class myvector
	{
	private:
		int _len;
		int _maxLen;
		int* _pArr;
	public:
		myvector()
		{
			_len = -1;
			_maxLen = 3;
			_pArr = new int[_maxLen];
		}
		myvector(myvector& v)
		{
			_len = v._len;
			_maxLen = v._maxLen;
			_pArr = new int[_maxLen];
			memcpy(_pArr, v._pArr, sizeof(int) * (_len + 1));
		}
		~myvector()
		{
			delete[] _pArr;
		}
		void push_back(int v)
		{
			if ((_len + 1) >= _maxLen)
			{
				_maxLen = 2 * _maxLen;
				int* p = new int[_maxLen];
				memcpy(p, _pArr, sizeof(void*) * (_len + 1));
				delete[] _pArr;
				_pArr = p;
			}
			//_len 默认为-1
			_len++;
			_pArr[_len] = v;
		}




	public:
		//迭代器内部不保证数据是否越界
		class iterator
		{
			friend class myvector;
		private:
			int _index;
			int* _pArr;
		public:
			/// <summary>
			/// 构造函数
			/// </summary>
			/// <param name="_pArr">数据位置</param>
			/// <param name="_index">当前数据的索引</param>
			iterator(int* pArr, int index)
			{
				_pArr = pArr;
				_index = index;
			}

			//重写前置++
			iterator& operator++()
			{
				++_index;
				return *this;
			}

			//重写!=
			bool operator!=(const iterator& it)
			{
				return _index != it._index;
			}
			//访问当前位置的数据成员
			int& operator*()
			{
				return _pArr[_index];
			}

		};

	public:
		//第一个元素
		iterator begin()
		{
			return iterator(_pArr, 0);
		}
		//最后一个元素的下一个位置
		iterator end()
		{
			return iterator(_pArr, _len + 1);
		}
		/// <summary>
		/// 返回下一个迭代器的位置
		/// </summary>
		/// <param name="it">迭代器</param>
		/// <returns></returns>
		iterator erase(const iterator& it)
		{
			//输出是把整体的位置往前移动
			for (int i = it._index; i < _len; i++)
			{
				_pArr[i] = _pArr[i + 1];
			}
			--_len;
			return it;
		}


	};

}

//尾部迭代器(倒叙迭代器)执行最后一个元素
//std::vector<int>::reverse_iterator revIt = vec.rbegin();
//下一个元素也是++
//end 为第一个元素的上一个元素   
//vec.rend();
//begin为最后一个元素
//vec.rbegin();


//头部位置  index=0;
//第一条数据  index=1;




int main8002933()
{
	myvector v;

	for (int i = 0; i < 10; i++)
	{
		v.push_back(i);
	}
	//动态数组迭代器再插入数据或删除数据时,可能会导致迭代器失效
	//v.erase(v.begin());
	//v.erase(v.begin());
	//v.erase(v.begin());
	//删除完begin后需要重新获取begin
	//std::cout << *begin << std::endl;
	//std::cout << *end << std::endl;
	myvector::iterator begin = v.begin();
	myvector::iterator end = v.end();
	std::cout << "=====\n";
	for (; begin != end; ++begin)
		std::cout << *begin << std::endl;

	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值