阵列VS载体:初级异同[关闭](Arrays vs Vectors: Introductory Si

2019-07-20 12:19发布

什么是一个数组,在C ++中的矢量之间的差异? 的差异的例子可能包括图书馆,象征主义,能力,等等​​。

排列

阵列包含特定类型的元件的特定号码。 因此,该程序编译时,编译器可以保留所需要的空间量,你必须指定它定义为当数组将包含元素的类型和数量。 编译器必须能够确定这个值的程序编译时。 一旦一个数组已被定义,可以使用该标识符用于阵列与索引一起访问所述阵列的特定元素。 [...]阵列零索引; 也就是说,第一元件是在索引0。此索引方案是指示在C ++指针和数组和该语言定义了指针运算规则之间的密切关系。

- C ++袖珍参考

向量

一种载体是对象的动态大小的序列,其提供阵列式operator[]随机访问。 成员函数push_back副本通过拷贝构造函数它的参数,增加了该副本作为最后一个项目的载体和一个增加它的大小。 pop_back确实完全相反的,通过去除最后一个元素。 插入或从一个矢量的末端删除项目需要分期常量时间,以及插入或从任何其他位置删除需要线性时间。 这些载体的基础。 还有很多更给他们。 在大多数情况下,载体应该是在C数组的第一选择。 首先,它们是动态调整大小,这意味着它们可以根据需要增加。 你不必做各种研究,以找出最佳的静态大小,如C数组的情况; 一个向量的增长需要,它可以被调整大小更大或更小,如果手动你需要。 其次,载体提供边界与检查at成员函数(但不与operator[]因此,如果您引用不存在的指标,而不是简单地看你的程序崩溃或更糟的是,继续执行与被破坏的数据,你可以做一些事情。

- C ++食谱

Answer 1:

数组:

  • 是一个内置的语言构造;
  • 从C89来几乎未经修改的;
  • 只是提供一个连续的,元件的可转位序列 ; 没有花里胡哨;
  • 是固定大小的; 你不能调整在C ++的阵列(除非它是POD的阵列,并且它与分配malloc );
  • 它们的大小必须是一个编译时间常数,除非它们是动态分配的;
  • 他们从那里你声明它们的范围取决于他们的存储空间;
  • 如果动态分配的,你必须明确地取消分配他们。
  • 如果他们是动态分配的,你只是得到一个指针,而不能确定它们的大小; 否则,可以使用sizeof (因此共同成语sizeof(arr)/sizeof(*arr)上一指针无意中使用时然而静静地失败);
  • 自动衰减到在大多数情况下一个指针; 特别地,这种情况将它们传递给一个函数,这通常需要通过为它们的大小的单独参数时;
  • 不能从函数返回;
  • 不能被复制/直接分配;
  • 对象的动态阵列需要一个默认的构造中,由于他们的所有元件必须首先构建;

std::vector

  • 是一个模板类;
  • 是一个C ++只是构造;
  • 被实现为动态阵列 ;
  • 生长和收缩动态;
  • 自动管理他们的存储器,这是在破坏释放;
  • 可以传递到/从功能(由值)返回;
  • 可复制/分配(此执行所有的存储元件的深层副本);
  • 不衰减的指针,但你可以明确地得到一个指向其数据( &vec[0]保证按预期工作);
  • 总是与内部动态数组其大小 (有多少个元素目前被存储)和容量 (多少元素可被存储在当前分配的块)沿带来;
  • 内部动态阵列不是对象本身内部分配(这只是包含几个“簿记”字段),而是由在相关的模板参数指定的分配器动态分配; 默认一个从如何在实际对象被分配得到从的FreeStore存储器(所谓的堆),独立地;
  • 因为这个原因,他们可能比小,短期,局部阵列“正规军”的阵列效率较低;
  • 重新分配的情况下,对象被复制 (移动时,在C ++ 11);
  • 不需要存储的对象的默认构造函数;
  • 与所谓的STL的其余部分更好地整合(它提供的begin() / end()方法,通常的STL typedef S,...)

也可以考虑“现代另类”到数组- std::array ; 我中已经描述另一个答案之间的区别std::vectorstd::array ,你可能想看看它。



Answer 2:

我要补充的是数组是非常低级别的结构在C ++中,你应该尽量远离他们尽可能在“学习的绳索” - 甚至Bjarne的Stroustrup的推荐这个(他是C的设计师++)。

向量非常接近相同的性能数组,但有许多的便利和安全功能。 你可能会开始使用API​​,可处理原始阵列,或建立自己的收藏时,交互时使用数组。



Answer 3:

这些参考几乎回答了你的问题。 简单地说,向量的长度是动态的,而阵列具有固定的大小。 使用阵列时,您可以指定在声明它的大小:

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

有时,你不会知道需要这样的载体将是理想的这种情况元素的数量。



文章来源: Arrays vs Vectors: Introductory Similarities and Differences [closed]