#include <iostream>
#include <utility>
template<class T>
class MyVector
{
private:
int size_;
int capacity_;
T* data;
void grow();
public:
typedef T* it;
MyVector();
MyVector(const MyVector &src);
MyVector(MyVector &&src);
~MyVector();
MyVector& operator=(MyVector rhs);
it begin();
it end();
int size();
void push_back(const T& value);
void insert(it pos, const T& value);
};
template<class T>
MyVector<T>::MyVector()
: size_(0), capacity_(0), data(nullptr)
{
}
template<class T>
MyVector<T>::MyVector(const MyVector &src)
: size_(src.size_), capacity_(src.capacity_), data(new T[src.size_])
{
for (int i = 0; i < size_; ++i)
data[i] = src.data[i];
}
template<class T>
MyVector<T>::MyVector(MyVector &&src)
: size_(src.size_), capacity_(src.capacity_), data(src.data)
{
src.size_ = 0;
src.capacity_ = 0;
src.data = nullptr;
}
template<class T>
MyVector<T>::~MyVector()
{
delete[] data;
}
template<class T>
MyVector<T>& MyVector<T>::operator=(MyVector rhs)
{
std::swap(size_, rhs.size_);
std::swap(capacity_, rhs.capacity_);
std::swap(data, rhs.data);
return *this;
}
template<class T>
typename MyVector<T>::it MyVector<T>::begin()
{
return data;
}
template<class T>
typename MyVector<T>::it MyVector<T>::end()
{
return data + size_;
}
template<class T>
int MyVector<T>::size()
{
return size_;
}
template<class T>
void MyVector<T>::grow()
{
static const int delta = 5; // <-- use whatever value makes sense for your use case...
int new_cap = capacity_ + delta;
T* new_data = new T[new_cap];
for(int i = 0; i < size_; ++i) {
new_data[i] = std::move(data[i]);
}
delete[] data;
data = new_data;
capacity_ = new_cap;
}
template<class T>
void MyVector<T>::push_back(const T & v)
{
if (size_ == capacity_)
grow();
data[size_] = v;
++size_;
}
template<class T>
void MyVector<T>::insert(typename MyVector<T>::it pos, const T & v)
{
int index = pos - data;
if (index < 0 || index > size_)
return; // or throw...
if (size_ == capacity_)
grow();
for(int i = size_ - 1; i >= index; --i)
data[i+1] = data[i];
data[index] = v;
++size_;
}
int main()
{
MyVector<int> vec;
auto printVec = [&](){
if (vec.size() == 0) {
std::cout << "(empty)";
}
else {
for(auto &value : vec)
std::cout << value << ' ';
}
std::cout << std::endl;
};
std::cout << "Before: "; printVec();
vec.push_back(1);
vec.push_back(3);
vec.push_back(5);
std::cout << "After push_back: "; printVec();
vec.insert(vec.begin()+1, 2);
vec.insert(vec.end()-1, 4);
std::cout << "After insert: "; printVec();
return 0;
}