返回

顺序表与手撕vector : 一文让你不再畏惧写STL!

后端

顺序表和vector都是一种动态数组,两者都有着插入、删除、查询等操作,但其底层实现原理有所不同。本文将详细介绍顺序表和vector的区别,并手把手教你实现一个简单的vector,助你彻底告别STL的畏惧,成为算法与数据结构的编程达人。

一、顺序表

顺序表是一种线性的数据结构,它将元素存储在连续的内存空间中。顺序表的优点是访问速度快,因为我们可以直接通过索引来访问元素。但顺序表的缺点是插入和删除元素时需要移动其他元素,因此效率较低。

二、vector

vector是一种动态数组,它与顺序表类似,但它使用一种叫做"内存重分配"的技术来提高插入和删除元素的效率。当vector需要更多空间时,它会自动分配一块新的内存空间,并将元素复制到新的内存空间中。当vector需要更少空间时,它会释放多余的内存空间。

三、顺序表和vector的区别

顺序表和vector的主要区别在于其底层实现原理不同。顺序表使用连续的内存空间来存储元素,而vector使用一种叫做"内存重分配"的技术来提高插入和删除元素的效率。

四、如何手写vector

实现一个简单的vector并不难,我们可以使用以下步骤:

  1. 定义一个结构体来存储vector的元素。
  2. 定义一个指针来指向vector的第一个元素。
  3. 定义一个整数来记录vector的长度。
  4. 定义一些函数来实现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的讲解。希望这篇文章能对你有帮助。