C++_vector容器模拟实现

vector容器模拟实现

#include<iostream>
#include<assert.h>

using namespace std;

namespace mystd
{
	template<class T>
	class vector
	{
	public:
		typedef T * iterator;
		typedef const T * const_iterator;

		size_t size() const
		{
			return _finish - _start;
		}

		size_t capacity() const
		{
			return _endOfStorage - _start;
		}

		T& operator[](size_t pos)
		{
			return _start[pos];
		}

		const T& operator[](size_t pos) const
		{
			return _start[pos];
		}

		iterator begin() const
		{
			return _start;
		}

		iterator end() const
		{
			return _finish;
		}

		const_iterator cbegin() const
		{
			return _start;
		}

		const_iterator cend() const
		{
			return _finish;
		}

		vector()
			:_start(nullptr),
			_finish(nullptr),
			_endOfStorage(nullptr)
		{}

		vector(int n, const T& value = T())
			:_start(nullptr),
			_finish(nullptr),
			_endOfStorage(nullptr)
		{
			T * tmp = new T[n];
			_start = tmp;
			_finish = _start + n;
			_endOfStorage = _start + n;
			for(size_t i = 0; i < n; i++)
			{
				_start[i] = value;
			}
		}

		template<class InputIterator>
		vector(InputIterator first, InputIterator last)
		{
			size_t sz = last - first;
			T * tmp = new T[sz];
			_start = tmp;
			_finish = _start + sz;
			_endOfStorage = _start + sz;
			for(size_t i = 0; i < size(); ++i)
			{
				_start[i] = first[i];
			}
		}

		vector(const vector<T>& v)
			:_start(nullptr),
			_finish(nullptr),
			_endOfStorage(nullptr)
		{
			reserve(v.capacity());
			auto it = begin();
			for(auto cit = v.cbegin(); cit != v.cend(); ++cit)
			{
				*it++ = *cit;
			}
			_finish = _start + v.size();
			_endOfStorage = _start + v.capacity();
		}

		~vector()
		{
			if(_start)
			{
				delete[] _start;
				_start = _finish = _endOfStorage = nullptr;
			}
		}
		
		vector<T>& operator=(const vector<T>& v)
		{
			if(this != &v)
			{
				delete[] _start;
				_start = _finish = _endOfStorage = nullptr;
				T * tmp = new T[v.capacity()];
				_start = tmp;
				for(size_t i = 0; i < v.size(); ++i)
				{
					_start[i] = v[i];
				}
				_finish = _start + v.size();
				_endOfStorage = _start + v.capacity();
			}
			return *this;
		}

		void resize(size_t n, const T& value = T())
		{
			if(n <= size())
			{
				_finish = _start + n;
				return;
			}
			if(n > capacity())
			{
				reserve(n);
			}
			size_t len = n - size();
			for(size_t i = 0; i < len; ++i)
			{
				push_back(value);
			}
		}

		void reserve(const size_t n)
		{
			if(n > capacity())
			{
				size_t oldSize = size();
				T * tmp = new T[n];
				if(_start)
				{
					for(size_t i = 0; i < oldSize; ++i)
					{
						tmp[i] = _start[i];
					}
				}
				_start = tmp;
				_finish = _start + oldSize;
				_endOfStorage = _start + n;
			}
		}

		void push_back(const T& x)
		{
			if(_finish == _endOfStorage)
			{
				size_t oldSize = size();
				size_t newCapacity = (capacity() == 0) ? 1 : oldSize * 2;
				reserve(newCapacity);
			}
			iterator pos = _finish;
			*pos = x;
			++_finish;
		}

		void pop_back()
		{
			iterator it = end();
			erase(--it);
		}

		iterator insert(iterator pos, const T& x)
		{
			assert(pos <= _finish);
			if(_finish == _endOfStorage)
			{
				size_t oldSize = size();
				size_t len = pos - _start;
				size_t newCapacity = (capacity() == 0) ? 1 : oldSize * 2;
				reserve(newCapacity);
				pos += len;
			}
			iterator it = _finish - 1;
			while(it >= pos)
			{
				*(it + 1) = *it;
				--it;
			}
			*pos = x;
			++_finish;
			return pos;
		}

		iterator erase(iterator pos)
		{
			for(iterator begin = pos + 1; begin != _finish; ++begin)
			{
				*(begin - 1) = *begin;
			}
			--_finish;
			return pos;
		}

	private:
		iterator _start;
		iterator _finish;
		iterator _endOfStorage;
	};
}

int main()
{
	char arr[] = {'s', 'd', 'g', 'h', 'e', 't', 'u', 'o'};
	mystd::vector<char> v(arr, arr + sizeof(arr)/sizeof(char));
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	v.resize(20, 'p');
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	v.reserve(30);
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	mystd::vector<char>::iterator pos = v.begin();
	pos += 3;
	v.insert(pos, 'a');
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	pos = v.begin();
	pos += 6;
	v.erase(pos);
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	v.push_back('q');
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	v.pop_back();
	for(auto x : v)
	{
		cout<<x<<" ";
	}
	cout<<endl;
	cout<<v.size()<<endl;
	cout<<v.capacity()<<endl;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值