C++カスタムvectorの実装(コピー構造、深いコピー、クラステンプレート)
23038 ワード
#pragma once
/* */
#include <iostream>
using namespace std;
template <typename T>
class MyVector
{
public:
MyVector();
MyVector(int len, T element); // len element
MyVector(const MyVector<T> &vec); //
~MyVector();
//
MyVector<T> & operator = (const MyVector<T> &vec);
// []
T & operator [] (int index); //
void push_back(T elment); // element;
T pop_back(); //
void insert(int pos,T element); // pos ,
void clear(); //
template<typename T2> // <<
friend ostream &operator << (ostream &out, const MyVector<T2> vec);
private:
T *m_ptrElement; //
int m_length; //
int m_capacity; //
};
template <typename T>
MyVector<T>::MyVector() : m_capacity(16), m_length(0)// len element
{
this->m_ptrElement = new T[m_capacity];
}
template <typename T>
MyVector<T>::~MyVector()
{
delete[]m_ptrElement;
}
template <typename T>
MyVector<T>::MyVector(int len, T element) :m_capacity(16)
{
m_capacity += len;
m_length = len;
m_ptrElement = new T[m_capacity];
// mencpy
for (int i = 0; i < m_length; ++i)
{
memcpy(&m_ptrElement[i], &element, sizeof(T));
}
}
template <typename T>
MyVector<T>::MyVector(const MyVector<T> &vec) //
{
m_capacity = vec.m_capacity;
m_length = vec.m_length;
m_ptrElement = new T[m_capacity];
memcpy(m_ptrElement, vec.m_ptrElement, m_length * sizeof(T));
}
//
template <typename T>
MyVector<T> & MyVector<T>::operator = (const MyVector<T> &vec)
{
if (this == &vec) return *this;
if (nullptr != m_ptrElement)
{
delete[]m_ptrElement;
m_ptrElement = nullptr;
}
m_capacity = vec.m_length + vec.m_capacity;
m_length = vec.m_length;
m_ptrElement = new T[vec.m_capacity];
memcpy(m_ptrElement, vec.m_ptrElement, sizeof(T)* vec.m_length);
return *this;
}
template <typename T>
T & MyVector<T>::operator [] (int index)
{
return m_ptrElement[index];
}
template <typename T>
void MyVector<T>::push_back(T elment)
{
// element
if (nullptr == m_ptrElement)
{
m_capacity = 16;
m_length = 0;
m_ptrElement = new T[m_capacity];
}
//
if (m_length == m_capacity)
{
// : * 2 + 1
T *ptrNewElement = new T[m_capacity * 2 + 1];
//
memcpy(ptrNewElement, m_ptrElement, sizeof(T) * m_length);
//
delete[]m_ptrElement;
//
m_ptrElement = ptrNewElement;
}
m_ptrElement[m_length++] = elment;
}
template<typename T2>
ostream &operator << (ostream &out, const MyVector<T2> vec)
{
for (int i = 0; i < vec.m_length; ++i)
{
out << vec.m_ptrElement[i] << ",";
}
out << endl;
return out;
}
int main()
{
MyVector<int> vec;
MyVector<double> vec1(10, 99.9);
cout << "vec:" << vec << endl;
cout << "vec1:" << vec1 << endl;
vec.push_back(2);
vec.push_back(5);
cout << "vec:" << vec << endl;
system("pause");
return 0;
}