我应该使用std :: vector而不是数组

时间:2017-03-05 18:27:00

标签: c++ arrays stdvector

我看到这个的方式,它们都有相同的功能,除了std :: vector似乎更灵活,所以什么时候我需要使用数组,我可以只使用std :: vector吗? 这不是一个新问题,原始问题没有我想要的答案

3 个答案:

答案 0 :(得分:2)

有一点值得注意的是,虽然迭代器在带有向量的许多函数中都会失效,但数组却不是这样。注意:std::swapstd::array迭代器仍将指向相同的位置。

查看更多: http://en.cppreference.com/w/cpp/container/array

数组优势的总结: https://stackoverflow.com/a/4004027/7537900

这一点似乎最有趣:

  

固定大小的数组可以直接嵌入到结构或对象中,   这可以改善内存局部性并减少堆数   需要分配

没有测试过,我不确定它是否真的如此。

以下是有关Code Vectors中竞争性编程的2D向量与阵列的讨论: https://discuss.codechef.com/questions/49278/whether-to-use-arrays-or-vectors-in-c

显然,在2D矢量中,2个维度中的内存不是连续的,只有一个维度,但在2D数组中它是。

答案 1 :(得分:1)

当使用std:vector时,唯一的性能是在达到容量时,因为必须重新定位内存以容纳堆上连续内存空间中的大量对象

因此,这里有关于灵活性和绩效的总结:

的std ::阵列;重新分配是不可能的,因此不会因堆上内存的重新定位而导致性能损失。

的std ::向量;仅在超出容量且发生重新分配时才会影响性能。您可以使用保留(大小)来粗略估计您需要的最大对象数量。与std :: array相比,这允许更大的灵活性,但当然,如果超出保留空间,则必须重新分配内存。

答案 2 :(得分:1)

根据经验,您应该使用:

  • 一个std :: array,如果大小在编译时固定
  • std :: vector的大小在编译时没有修复
  • 指向第一个元素地址的指针是您需要低级别访问
  • 如果要实现(非标准)容器
  • ,则为原始数组

标准容器即使在将它们传递给其他函数时也能够知道它们的大小,原始数组没有,并且有足够的好处从不在没有特定原因的情况下在C ++代码中使用原始数组。一个可能是需要低级优化的瓶颈,但只有在分析后才能确定瓶颈。您应该在实际情况下对标准容器是否实际添加任何过载进行基准测试。

我能想到的唯一好处是你是否实现了一个特殊的容器。由于标准容器不是派生的,因此您只有两个选择,要么您的类包含一个标准容器,要么在一个容器中包含一个容器,其中包含遍布各处的委托,或者模仿标准容器(通过从熟知的实现中复制代码,并专门化它。在这种情况下,您会发现自己直接管理原始数组。