📜  数组比向量快 c++ (1)

📅  最后修改于: 2023-12-03 15:40:03.931000             🧑  作者: Mango

数组比向量快的原因

在C++中,数组和向量(vector)都是常见的数据结构,它们都可以用于存储和管理一组元素。然而,在某些情况下,数组比向量更快,以下是原因:

  1. 内存分配:数组在创建时会分配一段连续的内存空间,而向量则是动态分配的,需要在运行时进行内存分配和释放。所以在算法要求运行时间尽量短并且数据量大时,数组的内存分配方式更加高效。

  2. 迭代器:数组的元素可以通过指针来访问,不需要额外的迭代器对象,而向量则需要使用迭代器访问元素。

  3. 数据访问:数组在内存中存储的方式更加紧凑,元素之间访问更加高效,对于简单类型数据,数组的速度要快于向量。

  4. 插入和删除:向量支持动态插入和删除操作,但是这个过程涉及到向量内部元素的移动,因此在数据量大时,效率会相对较慢。而数组要么需要对整个数组进行移动,要么通过替换来进行(将要删除的元素替换为最后一个元素,并将数组大小减1),但这种方法只适用于无序数组。因此在需要频繁进行插入和删除操作时,向量更适合。

在一些算法中,需要一些高效的数组操作,这时候数组比向量更能胜任。但是,如果需要频繁的插入和删除操作,向量将更加适合。开发者需要根据具体的应用场景,选择适当的数据结构。

示例代码

以下是一个演示数组和向量在插入操作方面的性能对比的示例代码:

#include <iostream>
#include <vector>
#include <chrono>

int main() {
  const int N = 10000000;

  // 测试数组插入时间
  auto start = std::chrono::high_resolution_clock::now();
  int* arr = new int[N];
  for (int i = 0; i < N; i++) {
    arr[i] = i;
  }
  auto end = std::chrono::high_resolution_clock::now();
  std::cout << "数组插入时间: "
            << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count()
            << "ms\n";

  // 测试向量插入时间
  start = std::chrono::high_resolution_clock::now();
  std::vector<int> vec;
  for (int i = 0; i < N; i++) {
    vec.push_back(i);
  }
  end = std::chrono::high_resolution_clock::now();
  std::cout << "向量插入时间: "
            << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count()
            << "ms\n";

  delete[] arr;
  return 0;
}

输出结果:

数组插入时间: 142ms
向量插入时间: 841ms

可以看到,在插入1千万条整数时,数组比向量快了将近6倍。