返回
顺序表与手撕vector : 一文让你不再畏惧写STL!
后端
2024-02-13 17:50:08
顺序表和vector都是一种动态数组,两者都有着插入、删除、查询等操作,但其底层实现原理有所不同。本文将详细介绍顺序表和vector的区别,并手把手教你实现一个简单的vector,助你彻底告别STL的畏惧,成为算法与数据结构的编程达人。
一、顺序表
顺序表是一种线性的数据结构,它将元素存储在连续的内存空间中。顺序表的优点是访问速度快,因为我们可以直接通过索引来访问元素。但顺序表的缺点是插入和删除元素时需要移动其他元素,因此效率较低。
二、vector
vector是一种动态数组,它与顺序表类似,但它使用一种叫做"内存重分配"的技术来提高插入和删除元素的效率。当vector需要更多空间时,它会自动分配一块新的内存空间,并将元素复制到新的内存空间中。当vector需要更少空间时,它会释放多余的内存空间。
三、顺序表和vector的区别
顺序表和vector的主要区别在于其底层实现原理不同。顺序表使用连续的内存空间来存储元素,而vector使用一种叫做"内存重分配"的技术来提高插入和删除元素的效率。
四、如何手写vector
实现一个简单的vector并不难,我们可以使用以下步骤:
- 定义一个结构体来存储vector的元素。
- 定义一个指针来指向vector的第一个元素。
- 定义一个整数来记录vector的长度。
- 定义一些函数来实现vector的基本操作,例如插入、删除、查询等。
五、手写vector的代码示例
#include <iostream>
using namespace std;
// 定义一个结构体来存储vector的元素
struct VectorElement {
int value;
};
// 定义一个指针来指向vector的第一个元素
VectorElement* vector = NULL;
// 定义一个整数来记录vector的长度
int vectorLength = 0;
// 定义一些函数来实现vector的基本操作
// 插入元素
void insert(int value) {
// 如果vector还没有分配内存,则分配一块新的内存空间
if (vector == NULL) {
vector = new VectorElement[1];
vectorLength = 1;
} else {
// 如果vector已经分配了内存,则检查是否有足够的空间来存储新的元素
if (vectorLength == vectorSize) {
// 如果没有足够的空间,则分配一块新的更大的内存空间
VectorElement* newVector = new VectorElement[vectorSize * 2];
// 将元素复制到新的内存空间中
for (int i = 0; i < vectorLength; i++) {
newVector[i] = vector[i];
}
// 释放旧的内存空间
delete[] vector;
// 将vector指向新的内存空间
vector = newVector;
// 更新vector的大小
vectorSize *= 2;
}
// 将新的元素添加到vector中
vector[vectorLength] = value;
// 更新vector的长度
vectorLength++;
}
}
// 删除元素
void remove(int index) {
// 检查索引是否有效
if (index < 0 || index >= vectorLength) {
return;
}
// 将要删除的元素后面的元素向前移动一位
for (int i = index; i < vectorLength - 1; i++) {
vector[i] = vector[i + 1];
}
// 更新vector的长度
vectorLength--;
}
// 查询元素
int get(int index) {
// 检查索引是否有效
if (index < 0 || index >= vectorLength) {
return -1;
}
// 返回元素的值
return vector[index].value;
}
// 主函数
int main() {
// 创建一个vector
vector = new VectorElement[1];
vectorLength = 1;
// 插入一些元素
insert(1);
insert(2);
insert(3);
// 删除一个元素
remove(1);
// 查询一个元素
int value = get(1);
// 打印vector中的元素
for (int i = 0; i < vectorLength; i++) {
cout << vector[i].value << " ";
}
cout << endl;
// 释放vector占用的内存空间
delete[] vector;
return 0;
}
以上就是顺序表和vector的区别以及如何手写vector的讲解。希望这篇文章能对你有帮助。