数组 VS 向量: 相似性和差异性简介

在 C + + 中,数组和向量有什么不同?差异的一个例子可能包括图书馆、象征、能力等。

数组

数组包含特定类型的特定数量的元素。为了使编译器能够在编译程序时保留所需的空间量,您必须指定数组定义时将包含的元素的类型和数量。编译器必须能够在编译程序时确定此值。一旦定义了数组,就可以使用该数组的标识符和索引来访问该数组的特定元素。[ ... ]数组是索引为零的; 也就是说,第一个元素位于索引为0的位置。这种索引方案表明了 C + + 中指针和数组之间的密切关系,以及该语言为指针算法定义的规则。

ー C + + 口袋引用

矢量

矢量是一个动态大小的对象序列,它提供数组风格的 operator[]随机访问。成员函数 push_back通过复制建构子复制它的参数,将其作为向量中的最后一个项添加,并将其大小增加1。pop_back通过删除最后一个元素来做完全相反的事情。从向量末尾插入或删除项目需要摊销的常量时间,从任何其他位置插入或删除项目需要线性时间。这些是向量的基本知识。他们还有很多事情要做。在大多数情况下,向量应该是比 C 样式数组更好的选择。首先,它们是动态大小的,这意味着它们可以根据需要增长。您不必像 C 数组那样进行各种研究来确定最佳的静态大小; 向量可以根据需要增长,如果需要,可以手动调整它的大小。其次,向量用 at成员函数(但不用 operator[])提供边界检查,这样,如果您引用一个不存在的索引,而不是简单地看着程序崩溃或更糟糕的情况,继续使用损坏的数据执行,就可以执行某些操作。

ー C + + 食谱

196144 次浏览

这些引用很好地回答了你的问题。简单地说,向量的长度是动态的,而数组有一个固定的大小。 使用数组时,在声明时指定其大小:

int myArray[100];
myArray[0]=1;
myArray[1]=2;
myArray[2]=3;

对于向量,只需声明它并添加元素

vector<int> myVector;
myVector.push_back(1);
myVector.push_back(2);
myVector.push_back(3);
...

有时你不知道需要多少个元素,所以矢量对这种情况来说是理想的。

我还要补充一点,数组在 C + + 中是非常低级的结构,在“学习诀窍”时,你应该尽可能远离它们——甚至连比雅尼·斯特劳斯特鲁普都推荐这样做(他是 C + + 的设计者)。

矢量与数组的性能非常接近,但有许多方便和安全的特性。在与处理原始数组的 API 接口时,或者在构建自己的集合时,您可能会开始使用数组。

数组:

  • 是一种内在的语言结构;
  • 来自 C89几乎未经修饰;
  • 只提供一个连续的、可索引的元素序列 ;
  • 是固定大小的; 在 C + + 中不能调整数组的大小(除非它是一个 POD 数组,并且使用 malloc分配) ;
  • 它们的大小必须是编译时常数,除非它们是动态分配的;
  • 它们的存储空间取决于您声明它们的范围;
  • 如果是动态分配的,则必须显式释放它们;
  • 如果它们是动态分配的,那么您只能得到一个指针,并且您无法确定它们的大小; 否则,您可以使用 sizeof(因此常用的习语 sizeof(arr)/sizeof(*arr),但是在无意中使用指针时会无声地失败) ;
  • 在大多数情况下会自动衰减为指针; 特别是当将指针传递给函数时,这种情况会发生,通常需要为指针的大小传递一个单独的参数;
  • 不能从函数返回; (除非它是 std: : array)
  • 不能直接复制/分配;
  • 对象的动态数组需要一个缺省构造函数,因为它们的所有元素必须首先构造;

返回文章页面

  • 是一个模板类;
  • 只是一个 C + + 构造;
  • 实施为 动态数组动态数组;
  • 动态地生长和收缩;
  • 自动管理他们的记忆,这是释放的破坏;
  • 可以传递给/从函数返回(按值) ;
  • 可以复制/分配(执行所有存储元素的深度复制) ;
  • 不会衰减到指针,但是您 可以显式地得到一个指向其数据的指针(&vec[0]保证按预期工作) ;
  • 始终带来与内部动态数组其 尺寸(有多少元素当前存储)和 容量(有多少元素 可以储存在当前分配块) ;
  • 内部动态数组不是在对象本身内部分配的(它只包含一些“簿记”字段) ,而是由相关模板参数中指定的分配器动态分配的; 默认的动态数组从自由存储(所谓的堆)获取内存,独立于实际对象分配的位置;
  • 由于这个原因,对于小型、短寿命的本地数组,它们的效率可能不如“常规”数组;
  • 在重新分配时,对象是 复制(移动,在 C + + 11) ;
  • 不需要存放物件的缺省构造函数;
  • 更好地与其他所谓的 STL 集成(它提供了 begin()/end()方法,通常的 STL typedefs,...)

还要考虑数组的“现代替代品”-std::array; 我已经在 另一个答案中描述了 std::vectorstd::array之间的区别,您可能想看看它。