数组对向量有什么优势?

时间:2016-06-29 04:41:56

标签: c++ arrays vector

好吧,经过一整年的编程并且只知道数组之后,我意识到了向量的存在(由我之前的帖子中的一些StackOverflow成员)。我自己做了大量的研究和研究,并用向量重写了我用数组和链表编写的整个应用程序。此时,我不确定我是否仍会使用数组,因为的矢量似乎更灵活,更高效。由于它们能够自动增长和缩小,我不知道我是否会使用数组。在这一点上,我个人看到的唯一优势是数组更容易编写和理解。数组的学习曲线是没有的,其中向量的学习曲线很小。无论如何,我确信在某些情况下可能有充分的理由使用数组,而在其他情况下使用数据,我只是很好奇社区的想法。我完全是一个新手,所以我认为我对两者的严格用法都不够了解。

如果有人甚至远程好奇,这是我正在练习使用矢量的应用程序。它非常粗糙,需要做很多工作:https://github.com/JosephTLyons/Joseph-Lyons-Contact-Book-Application

4 个答案:

答案 0 :(得分:4)

std::vector管理动态数组。如果你的程序需要一个在运行时动态改变其大小的数组,那么你最终会编写代码来执行std::vector所做的所有事情,但效率可能会低得多。

std::vector所做的是将所有代码包装在一个单独的类中,这样您就不需要继续编写相同的代码来反复执行相同的操作。

访问std::vector中的数据并不比访问动态数组中的数据有效,因为std::vector函数都是简单的内联函数,编译器优化了这些函数

但是,如果您需要固定大小,那么您可以比使用原始数组的std::vector稍微提高效率。但是,在这些情况下,使用std::array不会丢失任何内容。

我仍然使用原始数组的地方就像我需要一个临时固定大小的缓冲区,它不会被传递给其他函数:

// some code

{ // new scope for temporary buffer

    char buffer[1024]; // buffer
    file.read(buffer, sizeof(buffer)); // use buffer

} // buffer is destroyed here

但我发现很难证明在std::vector上使用原始动态数组是合理的。

答案 1 :(得分:2)

这不是一个完整的答案,但我能想到的一件事是,"增长和缩小的能力"如果你知道自己想要什么,那就不是一件好事。例如:假设您要保存1000个对象的内存,但内存将以每次都会导致向量增长的速率填充。当你可以简单地定义一个固定的数组

时,你从增长中获得的开销将是昂贵的

一般来说:如果你将一个数组放在一个向量上 - 你将拥有更多的权力,这意味着没有"背景"函数调用你实际上并不需要(调整大小),没有为你不使用的东西保存额外的内存(向量的大小......)。

此外,使用堆栈(数组)上的内存比堆(vector *)更快,如图所示here

*如图here所示,向量驻留在堆上并不完全准确,但它们确实在堆上保留的内存多于数组(在堆上不包含任何内容)

答案 2 :(得分:2)

一个原因是,如果你有很多非常小的结构,小的固定长度数组可以节省内存。

比较

struct point
{
float coords[4]
}

struct point
{
std::vector<float> coords;
}

对于这样的情况,替代方案包括std::array。此外,std::vector实现将过度分配,这意味着如果要调整大小为4个插槽,则可能为16个插槽分配了内存。

此外,内存位置将分散且难以预测,从而导致性能下降 - 使用异常大量的std::vectors可能还需要内存碎片问题,其中new开始失败。

答案 3 :(得分:1)

我认为这个问题最好回答:

std::vector对原始数组有什么好处?

我认为这个列表更容易枚举(不是说这个列表是全面的):

  • 自动动态内存分配
  • 正确的stackqueuesort实施附件
  • 与C ++ 11相关的语法功能集成,例如iterator

如果您没有使用此类功能,std::vector对原始阵列&#34;没有任何特别的好处。 (但同样地,在大多数情况下,缺点可以忽略不计)。

尽管我这样说,但对于典型的用户应用程序(即在Windows / unix桌面平台上运行),std::vectorstd::array(通常)通常是首选的数据结构,因为即使你没有这样做。如果您已经在任何地方使用std::vector ,则需要所有这些功能无处不在,否则您可以保持数据类型一致,以便您的代码更容易维持。

但是,因为核心std::vector只是在&#34;原始数组&#34;之上添加了功能。我认为理解数组如何工作以充分利用std::vectorstd::array(知道何时使用std::array作为一个例子)非常重要,这样您就可以减少&#34;碳足迹&#34; std::vector

此外,请注意,在使用

时,您将看到原始数组
  • 嵌入代码
  • 内核代码
  • 信号处理代码
  • 缓存高效矩阵实现
  • 处理非常大的数据集的代码
  • 表现真正重要的任何其他代码

这个教训不应该是惊慌失措并且说'#{必须std::vector所有的事情!&#34;当你在现实世界中遇到这种情况时。

另外:THIS!!!!

  
      
  • C ++的一个强大功能是,您通常可以编写一个类(或结构)来精确地模拟特定协议所需的内存布局,然后将类指针指向您需要使用的内存以方便解释或赋值。无论好坏,许多此类协议通常嵌入小型固定大小的阵列。
  •   
  • 在结构/类的末尾有一个数十年的黑客,用于放置1个元素的数组(如果你的编译器允许它作为扩展,甚至是0),在某些结构中瞄准指向结构类型的指针更大的数据区域,并根据内存可用性和内容的先前知识访问结构末尾的数组元素(如果在写入之前阅读) - 请参阅What's the need of array with zero elements?
  •   
  • 嵌入数组可以本地化内存访问要求,提高缓存命中率,从而提高性能
  •