欢迎光临散文网 会员登陆 & 注册

【从零手撕STL源码】3、手撕一个简易vector

2023-04-12 18:30 作者:爱丽-黑子  | 我要投稿

照着写了下,顺便修改了一下代码(就是修复了最后的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 << "数组越界啦!" << endl;

throw out_of_range("数组越界啦!");

}

}


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;

}

~~~

【从零手撕STL源码】3、手撕一个简易vector的评论 (共 条)

分享到微博请遵守国家法律