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

Should I use std::vector instead of array

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

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

因此,这里是关于灵活性和性能的总结:

std::array;重新分配是不可能的,因此不会因堆上内存的重新定位而影响性能。

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

需要注意的一件有趣的事情是,虽然迭代器在许多带有向量的函数中会失效,但数组并非如此。注意:std::swapstd::array 迭代器仍将指向同一个位置。

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

很好地总结了数组的优点:

这一点似乎最有趣:

fixed-size arrays can be embedded directly into a struct or object, which can improve memory locality and reducing the number of heap allocations needed

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

这里是关于 Code Chef 中竞争性编程的二维向量与数组的讨论: https://discuss.codechef.com/questions/49278/whether-to-use-arrays-or-vectors-in-c

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

根据经验,您应该使用:

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

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

我能想到的唯一好的理由是,如果你实现一个特殊的容器。由于标准容器并不意味着派生,您只有两个选择,要么 class 包含一个标准容器并以包含到处都有委托的容器结束,要么 mimic 一个标准容器(通过从众所周知的实现中复制代码),并对其进行专门化。在这种情况下,您会发现自己直接管理原始数组。