【STL】シミュレーション実装vector
本稿では,初歩的な実装であるため,C++シミュレーションでvectorを実装するいくつかのステップを初歩的に用いるが,STLライブラリのソースコードとはまだ異なり,後でSTLのvectorのような3つの反復器を用いてvectorを再シミュレーションする.
次に、シミュレーション実装STLの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
#include
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<_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];
}