【從零手撕STL源碼】3、手撕一個簡易vector

照著寫了下,順便修改了一下代碼(就是修復了最后的bug)以及潛在的雙重釋放問題(?)反正我是有的
代碼附上
~~~c++
#include<iostream>
using namespace std;
/*
vector push_back pop_back operator[] begin end size
*/
template<typename T>
class MyVector
{
public:
typedef T value;
typedef T* iterator;
typedef T& reference;
private:
iterator m_Data;//Data(start_ptr)
iterator start;//start_ptr
int m_len;//length
int pos;//m_len - 1
public:
MyVector(int len = 0);
~MyVector();
void push_back(T v);//MyVector.push_back()
value pop_back();//MyVector.pop_back()
int size();//MyVector.size()
iterator begin();//MyVector.begin()
iterator end();//MyVector.end()
T& operator[](int n);//MyVector[]
};
template<typename T>
MyVector<T>::MyVector(int len)
: m_len(len), m_Data(nullptr), start(nullptr), pos(0)
{
if (len > 0)
{
m_Data = new value[len];
start = m_Data;
}
}
template <typename T>
MyVector<T>::~MyVector()
{
if (m_Data != nullptr)
{
m_Data = nullptr;
delete m_Data;
}
}
template<typename T>
auto MyVector<T>::push_back(T v) -> void
{
if (m_len != pos)
{
*(start + pos) = v;
pos++;
}
else
{
cout << "越界了!" << endl;
}
}
template<typename T>
inline auto MyVector<T>::pop_back() -> value
{
--pos;
return *(start + pos);
}
template<typename T>
auto MyVector<T>::size() -> int
{
return this->m_len;
}
template<typename T>
typename MyVector<T>::iterator MyVector<T>::begin()
{
return this->start;
}
template<typename T>
typename MyVector<T>::iterator MyVector<T>::end()
{
return this->start + pos;
}
template<typename T>
T& MyVector<T>::operator[](int n)
{
if (n < pos)
{
return *(start + n);
}
else
{
cout << "數(shù)組越界啦!" << endl;
throw out_of_range("數(shù)組越界啦!");
}
}
template<typename T>
ostream& operator<<(ostream& cout,MyVector<T> vec)
{
for (int i = 0; i < vec.size(); i++)
{
cout << vec[i] << " ";
}
return cout;
}
int main()
{
MyVector<int> vec(10);
for (int i = 0; i < vec.size(); i++)
{
vec.push_back(i);
}
cout << vec << endl;
for (int i = 0; i < vec.size(); i++)
{
vec[i] = 100;
}
cout << vec << endl;
// for (MyVector<int>::iterator it=vec.begin(); it != vec.end(); it++)
// {
// cout << *it << " ";
// }
return 0;
}
~~~