#include <iostream>
namespace v{
template <typename T>
class vectorr
{
public:
vectorr():m_data(nullptr),m_size(0),m_capacity(0)
{}
~vectorr()
{
if(m_data != nullptr)
{
delete [] m_data;
}
m_size = 0;
m_capacity = 0;
}
//访问
T & at(int index)
{
if(index <0 || index >= m_size)
throw std::out_of_range("out of range");
return m_data[index];
}
T & front() //返回第一个
{
//if(m_data == nullptr)
// throw std::out_of_range("out of range"); 可以抛出合适的异常,可能不是outofrange
return m_data[0];
}
T & back() //返回都是&引用类型,这样就可以直接对数据进行修改
{
return m_data[m_size-1];
}
T & operator [] (int index) //使用重载 如果这里放在其他文件进行定义 那么就要加上作用域 比如 template <class T> 然后函数前面加上 vector<T>
{
return m_data[index];
}
void push_back(const T & value) //其中const 表示传递给函数的值不会被函数修改,然后直接把T类型的value引用传给函数,&优化代码,不用复制
{
if(m_size < m_capacity)
{
m_data[m_size] = value;
m_size++;
return ;
}
if(m_capacity == 0) //这边如果是刚创建的数组,那么把他的容量变成1
{
m_capacity = 1
}
else{
m_capacity *= 2;
}
T * data = new T[m_capacity];
for(int i = 0; i< m_size; i++)
{
data[i]= m_data[i];
}
if(m_data != nullptr)
{
delete [] m_data;
m_data = nullptr; //防止指针悬挂,指向被释放的空间
}
m_data = data;
m_data[m_size] = value;
m_size++;
}
void pop_back()
{
if(m_size >0)
m_size--;
}
private:
T * m_data; //指向T类型的指针 这里如果T是 int 就可以理解为什么样的数组,
int m_size;
int m_capacity;
}
};
c++面试知识点之手撕vector(简易版)
最新推荐文章于 2024-07-18 23:31:00 发布