21xrx.com
2024-12-22 23:58:52 Sunday
登录
文章检索 我的文章 写文章
C++手写vector的实现
2023-06-27 05:03:06 深夜i     --     --
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容器底层原理,也给我们提供了一些基本的数据结构实现的思路。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复