当前位置: 华文世界 > 科技

C++ STL: std::vector与std::array的深入对比

2024-08-01科技

std::vector 和 std::array 都是 C++ 标准模板库 (STL) 中用于存储数据的容器,但它们在设计目的、内存管理、性能特征等方面存在显著差异。

动态与静态大小

  • std::vector:是一个动态数组,它的大小可以在运行时改变。当你添加或删除元素时,std::vector 会自动调整其内部容量,必要时重新分配内存。
  • std::array:是一个固定大小的数组,必须在编译时确定其大小。一旦创建,std::array 的大小就不能改变。
  • 内存管理

  • std::vector:使用动态内存分配 ,这意味着它可以自由地增长和收缩。当 std::vector 的容量不足时,它会重新分配更大的内存块,将原有数据复制过去,并释放旧内存。这个过程可能会导致性能开销,尤其是在频繁添加元素时。
  • 上面的代码,我们没有指定vector的大小,而是通过push_back方法添加元素。

  • std::array:使用静态内存分配 ,元素存储在栈上或作为对象的成员时直接分配在对象内。这种内存管理方式提供了更好的性能和确定性,因为没有动态内存分配带来的开销和潜在的碎片问题。
  • 上面的代码,指定大小为3,如果初始化给4个值会报错。

    性能:

  • std::vector:对于随机访问和迭代操作,std::vector 提供了很好的性能,因为元素连续存储在内存中。但是,插入和删除操作(尤其是中间位置的操作)可能很慢,因为它可能需要移动大量元素。
  • std::array:同样支持快速的随机访问,但由于其大小固定,插入和删除操作通常不适用,除非整个数组被重新创建。
  • 使用场景:

  • std::vector: 适合于大小未知或可能变化的场景 ,如读取文件内容、存储动态生成的数据等。
  • std::array: 适合于大小已知且固定不变的场景 ,如缓存固定数量的最近事件、实现固定大小的环形缓冲区等。
  • 接口和使用方法:

    std::vector接口

    array接口

    总结:

    std::vector 和 std::array 提供了类似但不完全相同的接口。std::vector 更侧重于动态数组的功能,提供了更多的方法来调整容器的大小和容量,而 std::array 专注于固定大小数组的操作,没有提供改变大小的方法,但提供了更快的访问速度和更少的运行时开销。在选择使用哪个容器时,应根据具体的需求和场景来决定。