在 c + + std::vectorstd::array的区别有哪些?何时一个应优先于另一个?的优点和缺点各是什么?所有我的教科书那样是列出它们是相同的方式。

2010-12-12 22:55:35
问题评论:

您谈话关于使用术语向量和数组,或者您要求提供std::vector vs std::array (这是初次接触 C + + 0x),或std::vector与 C 样式数组进行比较?

我正在寻找的std::vector组与std::array和条款的不同方式进行了比较。

Zud, std::array不是 c + + 数组一样。std::array是 c + + 数组,其中的隐藏指针从类的用户的主要目的非常精简包装。我将更新我的答案。

我更新试题标题和文本,以反映您的澄清。

回答:

std::vector是一个模板类封装一个动态数组1,存储在堆中,它的增长和自动收缩,如果添加或移除元素时。它提供了所有挂钩 (begin()end()、 迭代器等),使其正常使用 STL 的其余部分。它还具有几个有用的方法,使您可以执行普通阵列上会比较麻烦,像如插入中间 (它将处理移动下列元素在幕后的所有工作) 的向量元素的操作。

因为它将在堆上分配的内存中存储元素,它相对于静态数组具有一些系统开销。

std::array是封装静态大小的数组,在对象本身,这意味着,如果您实例化堆栈中的类,阵列本身将在堆栈上存储的模板类。其大小在编译时 (它作为模板参数传递),已知,并且它不能扩大或缩小。

很多个有限比std::vector,但它通常会更有效,尤其是对于较小的尺寸,因为实际上它是主要的 C 样式数组的轻型包装。但是,由于禁用隐式转换为指针,则会更加安全,和它提供的许多 STL 相关功能和其他容器的std::vector ,以便您可以使用它轻松地 STL 算法和公司 Anyhow,固定大小的非常局限的是比std::vector更灵活.

std::array的介绍,有一看这篇文章;快速了解到std::vector和可能在它的操作,您可能想要看一看它的文档.


  1. 实际上,我认为,在标准详见方面最大的操作复杂程度不同 (例如 access 恒定时,线性时间,所有元素的迭代中添加和移除元素末尾常量中分期清偿时间等随机),但 AFAIK 还有没有其他方法来满足此类要求,而不是使用一个动态数组。@Lucretiel 中所述,该标准实际上需要元素将存储连续,因此它是一个动态数组,存储位置相关联的分配器将其放。

关于您的脚注︰ true,该标准同时也 guarentees 该指针算法的内部元素有效,这意味着它不必是一个数组︰ & vec [9]-& vec [3] = = 6 是如此。

我很肯定,该矢量并不自动收缩但以来 11 C + +,您可以调用 shrink_to_fit。

我是完全由静态数组的术语感到困惑,我不知道什么是正确的术语。您的意思是静态大小的数组并不是静态变量数组 (一个使用静态存储区)。stackoverflow.com/questions/2672085/...什么是正确的术语?是静态数组具有固定大小数组的草率术语?

@Zboson︰ 我的意思是静态的大小的数组;很抱歉,我同意的术语是令人费解,我将立即修复。

@Zboson︰ 绝对不是只有您、静态是一个非常受虐待的术语;非常static关键字在 c + + 中的有三个不同的相关的含义,这一术语也用于经常谈一谈在编译时固定的东西。我希望"静态中小企业是有点更清晰。

使用std::vector<T>类︰

  • ..是否一样快速与使用内置数组,假设您正在执行的事项内置数组允许您执行操作 (读取和写入到现有的元素)。

  • ..automatically 调整时插入新元素。

  • ...allows 您可以插入新元素的开头中间的向量,自动"移位"其余的"向上"(有意义的那样吗?) 的元素。它允许您去任何地方在std::vector,太,元素自动向下移动元素的其余部分。

  • ...allows 您可以执行范围检查阅读与at()方法 (您始终可以使用索引器[]如果您不希望要执行此检查)。

两个三个主要注意事项使用std::vector<T>:

  1. 您没有可靠地访问基础指针,哪些可能是一个问题,如果您正在使用第三方函数要求数组的地址。

  2. std::vector<bool>类太可笑了。它作为紧缩组标志,不是作为一个数组来实现。如果您希望bool组成的数组,请避免它 !

  3. 在使用过程中将std::vector<T>s 要比具有相同元素数目的 c + + 数组有点大。这是因为他们需要跟踪的少量的其他信息,例如其当前大小,因为他们只要std::vector<T>s 调整大小,请预留更多空间然后他们需要。这是为了防止它们无需调整每次插入新元素。通过提供自定义allocator,可以更改此行为,但我从不觉得需要做的 !


编辑︰ 先阅读 Zud 的答复提出的问题,我认为我应添加︰

std::array<T>类不是 c + + 数组一样。std::array<T>是 c + + 数组,其中的隐藏指针从类的用户的主要目的非常精简包装 (c + + 中数组会隐式强制转换为指针,通常为 dismaying 的效果)。std::array<T>类还存储其尺寸 (长度) 非常有用。

它具有一样快"作为使用动态分配的内置数组。另一方面,使用自动数组可能有相当不同的性能 (并不只在分配,因为局部性效果)。

为非布尔向量在 C + + 11 或更高版本,可以上std::vector<T>获取基础指针调用data()还可以采取元素 0 的地址 (使用 C + + 11 保证,将可能使用较早版本)。

为了强调一点 @MatteoItalia,效率之处在于存储数据。(所需要的vector) 的堆内存需要对系统的调用来分配内存,代价是很高,如果在盘点周期。堆栈的内存 (array) 是几乎"零开销"的时间,因为通过刚刚调整堆栈指针分配内存,并在进入函数只需一次完成。堆栈还避免了内存碎片。当然, std::array不总是会在堆栈上这取决于您所分配的位置,但它仍然会涉及到从堆到向量比较一个较少的内存分配。如果您有

  • 小"阵列"(在 100 个元素比如)-(典型的堆栈是大约 8 MB,因此不分配堆栈上的超过几 KB 或更少的如果您的代码是递归)
  • 将固定大小
  • 生命周期函数范围内 (或者是具有生存期相同的父类别的成员值)
  • 在盘点周期,

明确使用std::array ,通过向量。如果这些要求不为 true,则使用std::vector.

向量是容器类数组时分配的内存。

您的答案似乎解决std::vector<T>而不是T[],但问题是有关std::array<T>std::vector<T>.

向量具有在阵列的优点之一是就可能了解向量使用vector_name.size()当前大小.

可以想象,这可以是非常有用的在很多情况下,在其中方便地提取 array_list 中的元素数。

您还可以使用 std:: array 执行,

内容来源于Stack Overflow std::vector versus std::array in C++
请输入您的翻译

std::vector versus std::array in C++

确认取消