数组与vector:导言的相似之处和差异

C ++中的数组和vector之间有什么区别? 差异的一个例子可能包括图书馆,象征,能力等等。

排列

数组包含特定types的特定数量的元素。 为了让编译器在编译程序时能够保留所需的空间,必须指定数组在定义时所包含的元素的types和数量。 编译程序编译时,编译器必须能够确定这个值。 一旦定义了数组,就可以使用数组的标识符和索引来访问数组的特定元素。 数组是零索引的; 也就是说,第一个元素位于索引0处。这个索引scheme指示了C ++中指针和数组之间的紧密关系,以及语言为指针算术定义的规则。

– C ++袖珍参考

向量

向量是dynamic大小的对象序列,提供了数组式的operator[]随机访问。 成员函数push_back通过拷贝构造函数复制它的参数,并将该拷贝添加为向量中的最后一项,并将其大小递增1。 通过删除最后一个元素, pop_back完全相反。 插入或删除vector结束的项目需要分摊固定时间,插入或删除任何其他位置需要线性时间。 这些是vector的基础。 他们还有很多。 在大多数情况下,vector应该是您在C风格数组上的首选。 首先,它们是dynamic大小的,这意味着它们可以根据需要增长。 您不必进行各种研究来找出最佳的静态大小,就像C数组的情况一样; 一个向量根据需要增长,如果需要的话可以手动resize。 其次,向量提供了at成员函数(而不是operator[] )上的边界检查,所以如果你引用一个不存在的索引,而不是简单地看你的程序崩溃或更糟糕,继续执行损坏的数据,你可以做一些事情。

– C ++食谱

数组:

  • 是一个内build的语言结构;
  • 来自C89几乎没有修改;
  • 只提供了一个连续的,可索引的元素序列 ; 没有钟声和口哨;
  • 是固定的大小; 你不能在C ++中调整一个数组的大小(除非它是一个POD数组,而且是用malloc分配的)。
  • 它们的大小必须是编译时常量,除非它们是dynamic分配的;
  • 他们的存储空间取决于你声明的范围;
  • 如果dynamic分配,则必须明确释放它们;
  • 如果它们是dynamic分配的,你只能得到一个指针,而你不能确定它们的大小; 否则,可以使用sizeof (因此常用的成语sizeof(arr)/sizeof(*arr) ,但是当无意中在指针上使用时会失败)。
  • 在大多数情况下自动衰减到指针; 特别是在将它们传递给一个函数时会发生这种情况,通常需要为它们的大小传递一个单独的参数。
  • 不能从函数返回;
  • 不能直接复制/分配;
  • 对象的dynamic数组需要一个默认的构造函数,因为它们的所有元素都必须先构造;

std::vector

  • 是一个模板类;
  • 是一个C ++唯一的构造;
  • 被实现为dynamic数组 ;
  • dynamic增长和收缩;
  • 自动pipe理他们的内存,这是释放的破坏;
  • 可以传递给/从函数返回(按值);
  • 可以复制/分配(这将执行所有存储的元素的深层副本);
  • 不会衰减到指针,但可以明确地获取指向其数据的指针( &vec[0]保证按预期工作);
  • 总是会带来内部dynamic数组的大小 (当前存储了多less个元素)和容量 (当前分配的块中可以存储多less个元素);
  • 内部dynamic数组不是在对象内部分配的(它只包含一些“簿记”字段),而是由相关模板参数中指定的分配器dynamic分配的; 默认的从freestore(所谓的堆)获取内存,与实际对象的分配方式无关;
  • 由于这个原因,它们可能比小规模,短寿命的本地arrays的“正规”arrays效率低;
  • 当重新分配时,对象被复制 (在C ++ 11中移动);
  • 不需要存储对象的默认构造函数;
  • 与其他所谓的STL(它提供了begin() / end()方法,通常的STL typedef ,…)

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

我会补充说,C ++中的数组是非常低级的结构,你应该尽可能地远离它们,甚至是Bjarne Stroustrup推荐的(他是C ++的devise者)。

载体的性能与arrays非常接近,但具有很多便利性和安全性。 在与处理原始数组的API进行交互时,或者在构build自己的集合时,您可能会开始使用数组。

那些参考几乎回答了你的问题。 简而言之,向量的长度是dynamic的,而数组的大小是固定的。 当使用一个数组时,你可以在声明时指定它的大小:

 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); ... 

有时你不会知道所需要的元素的数量,所以一个vector对于这种情况是理想的。