【STL】模拟实现vector

35 篇文章 1 订阅
3 篇文章 0 订阅

本文初步用C++模拟实现vector的一下几个步骤,因为是初步实现,和STL库中的源码还有些不一样,后期会使用类似STL中的vector的三个迭代器再次模拟实现vector。


void PushBack(const DataType& data);
void PopBack();
void Insert(size_t pos, const DataType& data);
void Erase(size_t pos);
int Find(const DataType& data)const;
void Clear();
size_t Size()const;
void ReSize(size_t size, const DataType& data = DataType());
size_t Capacity()const;
bool Empty()const;
DataType& Front();
const DataType& Front()const;
DataType& Back();
const DataType& Back()const;
void Assign(size_t n, const DataType& data = DataType());
DataType& operator[](size_t index);
const DataType& operator[](size_t index)const;
DataType& At(size_t index);
const DataType& At(size_t index)const;



下面给出模拟实现STL中的vector代码:


#include <memory>
#include <iostream>
using namespace std;

typedef int DataType;
class Vector
{
public:
	//构造函数
	explicit Vector(size_t capacity = 0)
		:_pData(NULL),
		_capacity(capacity),
		_size(0)
	{
		_pData = new DataType[_capacity];
	}

	// 有size个值为data的元素
	//拷贝构造函数
	Vector(const DataType& data)
		:_size(0)
		, _capacity(0)
		, _pData(NULL)
	{
		*this = data;
	}
	//赋值运算符重载
	Vector& operator=(const Vector& v)
	{
		if (&v != this)
		{
			DataType* tmp = v._pData;
			_size = v._size;
			_capacity = v._capacity;
			for (size_t i = 0; i < v._size; ++i)
				{
				    _pData[i] = v._pData[i];
				}
			delete[] tmp;
		}
		return *this;
	}
	//析构函数
	~Vector()
	{
		if (_pData)
		{
			delete[] _pData;
			_pData = NULL;
		}
	}

	/
	void PushBack(const DataType& data);
	void PopBack();
	void Insert(size_t pos, const DataType& data);
	void Erase(size_t pos);
	int Find(const DataType& data)const;
	void Clear();
	size_t Size()const;
	void ReSize(size_t size, const DataType& data = DataType());
	size_t Capacity()const;
	bool Empty()const;
	DataType& Front();
	const DataType& Front()const;
	DataType& Back();
	const DataType& Back()const;
	void Assign(size_t n, const DataType& data = DataType());
	DataType& operator[](size_t index);
	const DataType& operator[](size_t index)const;
	DataType& At(size_t index);
	const DataType& At(size_t index)const;

	//
private:
	void _CheckCapacity();
	friend std::ostream& operator<<(std::ostream& _cout, const Vector& v);
private:
	DataType* _pData;
	size_t _capacity;
	size_t _size;
};

//检查容积是否已满,不满足申请
void Vector::_CheckCapacity()
{
	if (_size == _capacity)
	{
		DataType *tmp = new DataType[2 * _size];
		if (NULL != *tmp)
		{
			for (size_t i = 0; i < _size; i++)
			{
				tmp[i] = _pData[i];
			}
			delete[] _pData;
		}
		_pData = tmp;
	}
}
//实现尾部插入
void Vector::PushBack(const DataType& data)
{
	_CheckCapacity();
	_pData[_size] = data;
}
//实现尾部删除
void Vector::PopBack()
{
	if (this->_size == NULL)
	{
		cout << "次链表为空,不可删除" << endl;
	}
	this->_size--;
}
//pos位置上插入值元素 
void Vector::Insert(size_t pos, const DataType& data)
{
	_CheckCapacity();
	DataType *tmp = new DataType[_size++];
	tmp = _pData;
	for (size_t i = _size; i >= pos; i--)
	{
		tmp[i] = tmp[i-1];
	}
	tmp[pos] = data;
}
//删除pos位置上的元素
void Vector::Erase(size_t pos)
{
	if (NULL == _pData[pos])
	{
		cout << "此位置为空,无法删除" << endl;
	}
	else
	{
		for (size_t i = _size; i >= pos; i--)
		{
			_pData[i-1] = _pData[i];
		}
		this->_capacity--;
		this->_size--;
	}
}
//查找值为data的元素
int Vector::Find(const DataType& data)const
{
	for (size_t i = 0; i <= _size; i++)
	{
		if (_pData[i] == data)
		{
			return i;
		}
		return -1;
	}
}
//删除顺序表所有元素
void Vector::Clear()
{
	*this = NULL;
	this->_capacity = 0;
	this->_size = 0;
}
//求顺序表的长度
size_t Vector::Size()const
{
	return _capacity;
}
//改变vector中元素的数目
//如果size比当前的vector数目要小,
//vector的容量要缩减到第一个参数的大小,既是size.并且溢出那些超出size的元素并销毁他们
//如果size比当前的vector数目要大,
//vector的末尾需要扩展的元素个数,
void Vector::ReSize(size_t size, const DataType& data = DataType())
{
	if (size < this->_size)
	{
		this->_size = size;
		for (size_t i = size; i < _size; i++)
		{
			_pData[i] = 0;
		}
	}
	else if (size == this->_size)
	{
	}
	else
	{
		this->_size = size;
	}
}
//返回vector对象最多能容纳多少个元素
size_t Vector::Capacity()const
{
	return _capacity;
}
//如果对象为空,则返回true,否则返回false
bool Vector::Empty()const
{
	if (NULL == _pData)
	{
		return true;
	}
	else
	{
		return false;
	}
}
//返回当前Vector容器中起始元素的应用
DataType& Vector::Front()
{
	return *_pData;
}
const DataType& Vector::Front()const
{
	return *_pData;
}
DataType& Vector::Back()
{
	--_size;
}
const DataType& Vector::Back()const
{
	return _pData[_size - 1];
}
//将区间【first,last】的元素复制到当前的Vector容器中,或者赋N个值为X的元素到vector容器中,
//这个容器会清除掉vector容器中以前的内容。
void Vector::Assign(size_t n, const DataType& data = DataType())
{
	DataType *tmp = new DataType[n];
	for (size_t i = 0; i <= n; i++)
	{
		tmp[i] = data;
	}
	if (n < _size)
	{
		_CheckCapacity();
	}
	_size = n;
	_pData = tmp;
	delete[] tmp;
}
//重载下标操作符非常量版本
DataType& Vector::operator[](size_t index)
{
	return _pData[index];
}
//重载下标操作符常量版本
const DataType& Vector::operator[](size_t index)const
{
	return _pData[index];
}
DataType& Vector::At(size_t index)
{
	return _pData[index];
}
const DataType& Vector::At(size_t index)const
{
	return _pData[index];
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值