21xrx.com
2025-03-29 17:03:28 Saturday
文章检索 我的文章 写文章
C++手写vector的实现
2023-06-27 05:03:06 深夜i     45     0
C++ 手写 vector 实现 数据结构

C++中的vector是一个非常强大的容器,支持动态增长和随机访问。然而,为了更好地理解vector的实现原理,我们可以手动实现一个简单版本的vector。

首先,我们需要定义vector类的基本数据结构。我们可以使用动态分配的数组和一个变量来跟踪vector的大小。

template <typename T>
class MyVector{
private:
T* m_data;  // 动态分配的数组
int m_size; // 标记vector当前大小
};

我们需要实现vector的基本方法:push_back、pop_back、at、size,以及析构函数。

template <typename T>
class MyVector{
private:
T* m_data;  // 动态分配的数组
int m_size; // 标记vector当前大小
public:
MyVector() : m_data(nullptr), m_size(0){}  // 默认构造函数
~MyVector() { delete[] m_data; } // 析构函数
void push_back(const T& value)
{
if(m_size == 0)
{
m_data = new T[1];
}
else
{
T* temp = new T[m_size + 1];
for(int i = 0; i < m_size; i++)
{
temp[i] = m_data[i];
}
delete[] m_data;
m_data = temp;
}
m_data[m_size] = value;
++m_size;
}
void pop_back()
{
if(m_size > 0)
{
--m_size;
T* temp = new T[m_size];
for(int i = 0; i < m_size; i++)
{
temp[i] = m_data[i];
}
delete[] m_data;
m_data = temp;
}
}
T& at(int index)
{
if(index < 0 || index >= m_size)
{
throw std::out_of_range("Out of range!");
}
return m_data[index];
}
int size() const
{
return m_size;
}
};

我们用动态分配的数组来存储vector的元素。在push_back方法中,我们在数组的末尾添加一个元素,如果数组已满,则需要创建一个新的数组,并将原数组复制到新数组中。在pop_back方法中,我们从数组尾部删除一个元素,如果vector为空,则不会进行任何操作。在at方法中,我们对于越界的访问抛出一个异常。最后,我们需要一个方法来返回vector当前的大小。

现在,我们手写的vector类就完成了。我们可以使用和标准vector类似的方式使用它。

int main()
{
MyVector<int> myVec;
myVec.push_back(1);
myVec.push_back(2);
myVec.push_back(3);
std::cout << "size = " << myVec.size() << std::endl;
std::cout << "last element = " << myVec.at(myVec.size() - 1) << std::endl;
myVec.pop_back();
std::cout << "size after pop_back = " << myVec.size() << std::endl;
}

手写vector类的实现可以帮助我们更好地理解STL容器底层原理,也给我们提供了一些基本的数据结构实现的思路。

  
  

评论区