C++小工修炼手册Ⅻ(vector实现)

T():
如果T代表的是内置类型, T()代表的是 0
如果T代表的是自定义类型,那么T()代表的就是调用这种类型的无参构造函数

erase()函数用迭代器参数,删除元素之后又会返回一个迭代器,按道理来说迭代器不应该失效的,但是STL让迭代器失效了,这样做的目的就是,假如你删的是最后一个元素,尾位置只需要前移,这样的话,迭代器就失效了。
一般我们看STL的源码看的都是SGI版本的因为,SGI版本的代码可读性更高,而PJ版本的可读性太低了

vecto有一个缺点就是在任意位置的插入删除效率比较低

#include<iostream>
#include<assert.h>
using namespace std;
namespace N1
{
 	template<class T>
 	class vector
 	{
 	public:
  	//vector迭代器实际上就是原生态的指针
  		typedef T*  iterator;
 	public:
  		vector()
   		:_begin(nullptr)
   		, _end ( nullptr)
   		,_endofstorage(nullptr)
  		{}
  		vector(int n, const T& data)
   		:_begin(new T[n])
  		{
   			for (int i = 0; i < n; ++i)
   			{
    				_begin[i] = data;
   			}
   			_end = _begin + n;
   			_endofstorage = _end;
  		}
  		template<class Iterator>  //任意类型区间
  		vector(Iterator first, Iterator end)
  		{
   			int length = 0;
   			T* temp = first;
   			auto it = first;
   			while (it != end)
   			{
    				++it;
    				++length;
   			}
   			_begin = new T[length];
   			for (int i = 0; i < length; ++i)
   			{
    				_begin[i] = *temp++;
   			}
   			_end = _begin + length;
   			_endofstorage = _end;
  		}
  		vector(vector<T>& data)
  		{
   			int si = data.size();
   			_begin = new T[si];
   			for (int i = 0; i < si; ++i)
   			{
    				_begin[i] = data[i];
   			}
   			_end = _begin + si;
   			_endofstorage = _end;
  		}
  		vector<T>& operator=(vector<T>& data)  //赋值运算符里面我给出了两步操作
  		{
   			if (_begin)
   			{
    				delete[] _begin;
    				_begin = nullptr;
    				_end = nullptr;
    				_endofstorage = nullptr;
   			}
   			int si = data.size();
   			_begin = new T[si];
   			for (int i = 0; i < si; ++i)
   			{
    				_begin[i] = data[i];
   			}
  	 		_end = _begin + si;
   			_endofstorage = _end;
   			return *this;
  		}
  		~vector()
  		{
   			if (_begin)
   			{
    				delete[] _begin;
    				_begin = nullptr;
    				_end = nullptr;
    				_endofstorage = nullptr;
   			}
  		}
  		iterator begin()
  		{
   			return _begin;
  		}
  		iterator end()
  		{
  			 return _end;
  		}
  		void resize(int newsize, const T& data = T())
  		{
   			int oldsize = size();
   			if (newsize > oldsize)
   			{    
    				if (capacity() < newsize)
     				reserve(newsize);
    				for (int i = oldsize; i < oldsize + (newsize - oldsize); ++i)
    				{
     					_begin[i] = data;
    				} 
   			}
   			_end = _begin + newsize;
  		}
  		void reserve(int newcapacity)
  		{
  	 		int n = size();
   			int oldcapacity = capacity();
   			if(newcapacity > oldcapacity)
   			{
   	 			T* temp = new T[newcapacity];
    				if (_begin)
    				{
     					for (int i = 0; i < n; ++i)
     					{	
      						temp[i] = _begin[i];
     					}
     					delete[] _begin;
    				}
    				_begin = temp;
    				//_end = _begin + size();  这样写有坑,必须要在之前的位置将size()保存起来,因为扩容结束,_begin只向新空间,_end依然在旧空间,相减无意义,但是+在_end上无意义,运行会出错
    				_end = _begin + n;
    				_endofstorage = _begin + newcapacity;
   			}
  		}
  		const T& operator[](int n)const
  		{
   			assert(n < size());
   			return _begin[n];
  		}
  		T& operator[](int n)
  		{
   			assert(n < size());
   			return _begin[n];
  		}
  		T& front()
  		{
   			return *_begin;
  		}
  		const T& front() const
  		{
   			return *_begin;
  		}
  		T& back()
  		{
   			return *(_end - 1);
  		}
  		const T& back() const
  		{
   			return *(_end - 1);
  		}
  		void push_back(const T& data)
  		{
   			check();
   			*_end++ = data;
  		}
  		void pop_back()
  		{
   			_end--;
 	 	}
  		iterator insert(iterator pos,const T& data)  //返回值意思是刚插入元素的位置
  		{
   			check();  //检查是否需要扩容
   			auto it = _end;
   			while (it >= pos)
   			{
   	 			*(it) = *(it - 1);
    				it--;
   			}
   			*pos = date;
   			_end++;  //标记尾部的标记后移
   			return pos;
  		}
  		iterator erase(iterator pos)
  		{
   			auto it = pos;
   			while (it != end())
   			{
    				*it = *(it + 1);
    				it++;
   			}
   			--_end;  标记尾部的标记前移
   			return pos;
  		}
  		int size()
  		{
   			return _end - _begin;
  		}
  		int capacity()
  		{
 		  	return _endofstorage - _begin;
  		}
  		bool empty()
  		{
   			return _begin == _end;
  		}
  		void clear()
  		{
   			_end = _begin;
  		}
 	private:
  		T* _begin;  //标记起始位置
  		T* _end;  //标记有效元素末尾
  		T* _endofstorage;  //标记空间末尾
  		void check()
  		{
   			if (_end == _endofstorage)
   			{
    				reserve(capacity() * 2 + 1);
   			}
  		}
 	}; 
 	void test()
 	{
  		vector<int> v1;
  		vector<int> v2(10,5);
  		int a[] = { 1, 2, 3, 4, 5 };
  		vector<int> v3(a, a + (sizeof(a) / sizeof(a[0])));
  		vector<int> v4(v3);
  		vector<int> v5;
  		v5 = v4;
  		cout << v1.size() << endl; 
  		cout << v1.capacity() << endl;
  		cout << v2.size() << endl;
  		cout << v2.capacity() << endl;
  		cout << v3.size() << endl;
  		cout << v3.capacity() << endl;
 		cout << v4.size() << endl;
 	 	cout << v4.capacity() << endl;
 	 	cout << v5.size() << endl;
 	 	cout << v5.capacity() << endl;
	  	auto it = v3.begin();
  		while (it != v3.end())
  		{
  	 		cout << *it << " ";
  	 		it++;
  		}
  		cout << endl;
  		cout << v3.front() << endl;
 		cout << v3.back() << endl;
 	}
 	void test1()
 	{
  		vector<int> v1;
  		v1.push_back(1);
  		v1.push_back(2);
 		v1.push_back(3);
		v1.push_back(4)	;
  		v1.push_back(5);
  		auto it1 = v1.begin();
  		while (it1 != v1.end())
  		{
  	 		cout << *it1 << " ";
   			it1++;
  		}
  		cout << endl;
  		v1.pop_back();
  		v1.pop_back();
  		v1.pop_back();
  		auto it2 = v1.begin();
  		while (it2 != v1.end())
  		{
   			cout << *it2 << " ";
   			it2++;
  		}
  		cout << endl;
 	}
}
using namespace N1;
int main()
{
 	//test();
 	//test1();
 	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值