您的位置:首页 > 其它

【STL】模拟实现vector

2017-03-22 00:46 471 查看
本文初步用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
;
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];
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: