C++超详细讲解模拟实现vector
简介
vector
是C++标准模板库(STL)中的一个容器,可以动态地管理数组。在实际开发中,我们经常用到 vector
来管理动态数组,但是很少有人知道 vector
的实现原理。本篇文章将从头实现一个简单的 vector
容器,并且说明 vector
是如何进行动态内存管理的。并且通过代码演示来辅助讲解。
实现步骤
1. 定义一个 Vector 类
首先我们需要定义一个 Vector
类来模拟 vector
的行为,这个类的主要目的是管理一个动态数组,并且提供常用的方法。以下是这个类的头文件:
template <class T>
class Vector {
public:
Vector();
Vector(int size);
Vector(const Vector<T>& other);
~Vector();
void push_back(const T& value);
void pop_back();
void clear();
int size();
T& operator[](int index);
Vector<T>& operator=(const Vector<T>& other);
private:
T* mData; // 动态数组指针
int mSize; // 当前 Vector 中元素的个数
int mCapacity; // Vector 所分配空间的大小
};
2. 编写构造函数和析构函数
在 Vector 类中的构造函数和析构函数是非常重要的,因为我们需要在构造函数中分配内存空间,并且要在析构函数中释放内存空间。
template <typename T>
Vector<T>::Vector() :
mData(0), mSize(0), mCapacity(0) {
}
template <typename T>
Vector<T>::Vector(int size) :
mData(new T[size]), mSize(size), mCapacity(size) {
}
template <typename T>
Vector<T>::Vector(const Vector<T>& other) :
mData(new T[other.mCapacity]), mSize(other.mSize), mCapacity(other.mCapacity) {
for (int i = 0; i < mSize; i++) {
mData[i] = other.mData[i];
}
}
template <typename T>
Vector<T>::~Vector() {
delete[] mData;
}
3. 编写 push_back 和 pop_back 函数
push_back
函数用于在 Vector
的末尾添加元素。如果 Vector
中元素个数已经满了,则需要扩展 Vector
占用的内存空间。pop_back
函数则用于弹出 Vector
最后一个元素,如果 Vector
为空则不需要做任何操作。
template <typename T>
void Vector<T>::push_back(const T& value) {
if (mSize == mCapacity) {
if (mCapacity == 0) {
mCapacity = 1;
}
else {
mCapacity *= 2;
}
T* newData = new T[mCapacity];
for (int i = 0; i < mSize; i++) {
newData[i] = mData[i];
}
delete[] mData;
mData = newData;
}
mData[mSize++] = value;
}
template <typename T>
void Vector<T>::pop_back() {
if (mSize > 0) {
mData[--mSize].~T();
}
}
4. 编写 clear 函数
clear
函数用于释放 Vector
指针占用的内存,我们需要先调用每个元素的析构函数,然后释放 Vector
指针占用的内存空间。
template <typename T>
void Vector<T>::clear() {
for (int i = 0; i < mSize; i++) {
mData[i].~T();
}
mSize = 0;
}
5. 编写 operator[] 函数
operator[]
函数用于通过索引获取 Vector
中的元素,这个函数只是简单地返回数组项。
template <typename T>
T& Vector<T>::operator[](int index) {
return mData[index];
}
6. 编写赋值运算符函数
为了方便使用,我们需要实现一个赋值运算符函数。
template <typename T>
Vector<T>& Vector<T>::operator=(const Vector<T>& other) {
if (this != &other) {
delete[] mData;
mData = new T[other.mCapacity];
mSize = other.mSize;
mCapacity = other.mCapacity;
for (int i = 0; i < mSize; i++) {
mData[i] = other.mData[i];
}
}
return *this;
}
示例说明
示例一
下面是一个简单的 vector
模拟程序:
#include "Vector.h"
#include <iostream>
using namespace std;
int main() {
Vector<int> v;
for (int i = 0; i < 7; i++) {
v.push_back(i);
}
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
v.pop_back();
v.pop_back();
v.pop_back();
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
cout << endl;
v.clear();
return 0;
}
运行结果:
0 1 2 3 4 5 6
0 1 2
这个程序实现了以下操作:
1. 创建了一个 Vector
容器;
2. 用 push_back
函数向 Vector
中添加元素;
3. 通过 operator[]
函数来访问元素;
4. 使用 pop_back
函数删除最后几个元素;
5. 使用 clear
函数清空 Vector
容器。
示例二
下面是另一个简单的 vector
程序,用于演示赋值运算符的使用:
#include "Vector.h"
#include <iostream>
using namespace std;
int main() {
Vector<int> v1;
for (int i = 0; i < 5; i++) {
v1.push_back(i);
}
Vector<int> v2;
v2 = v1;
v2.push_back(5);
for (int i = 0; i < v1.size(); i++) {
cout << v1[i] << " ";
}
cout << endl;
for (int i = 0; i < v2.size(); i++) {
cout << v2[i] << " ";
}
cout << endl;
return 0;
}
运行结果:
0 1 2 3 4
0 1 2 3 4 5
这个程序实现了以下操作:
1. 创建了两个 Vector
容器;
2. 用 push_back
函数向第一个 Vector
中添加元素;
3. 使用赋值运算符 =
来将第二个 Vector
初始化为第一个 Vector
;
4. 向第二个 Vector
中添加一个元素;
5. 通过 operator[]
函数来分别访问两个 Vector
中的元素。
总结
本篇文章实现了一个简单的 Vector
容器,并且说明了实现 Vector
容器的基本原理。同时借助代码演示也让读者对 Vector
的常用操作有更深入的了解。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++超详细讲解模拟实现vector - Python技术站