C++ C++;当大小固定但不是constexpr时,std::array的替代方案?

C++ C++;当大小固定但不是constexpr时,std::array的替代方案?,c++,arrays,vector,C++,Arrays,Vector,如果我不想提供constexpr size,那么std::array的最佳替代品是什么?我想最好只使用std::vector并在其上保留(…),但也许我忽略了什么?std::vector应该是正确的容器选择,如果需要在运行时确定大小。std::vector可能是您的答案。我只是认为reserve()不能保证任何加速 比亚恩·斯特罗斯图普: 人们有时会担心性病媒增长的成本 逐渐地。我过去常常担心这一点,并用reserve()来 优化增长。在测量我的代码并反复 在real中很难找到reserve()

如果我不想提供constexpr size,那么std::array的最佳替代品是什么?我想最好只使用
std::vector
并在其上保留(…),但也许我忽略了什么?

std::vector
应该是正确的容器选择,如果需要在运行时确定大小。

std::vector
可能是您的答案。我只是认为
reserve()
不能保证任何加速

比亚恩·斯特罗斯图普:

人们有时会担心性病媒增长的成本 逐渐地。我过去常常担心这一点,并用reserve()来 优化增长。在测量我的代码并反复 在real中很难找到reserve()的性能优势 程序,我停止使用它,除非需要避免 迭代器无效(在我的代码中很少见)。再一次:测量之前 你优化了


[请参阅“为什么标准容器这么慢?”]的底部。]

是的,使用
std::vector

所以如果你的代码是

std:array<int, 42> my_array;
std:array my_array;
换成

std:vector<int> my_array(42);
std:vector my_数组(42);

注意:您可能不想使用
reserve
,因为它将
向量保留为空。如果您使用的是
std::array
,那么您的代码没有空数组的概念,因此最好用一个
std::vector
实例来表示,该实例在构建时填充,并且从未调整大小。

有一个固定大小的建议。不幸的是,它没有进入C++14。为什么委员会决定不接受它?我看到它是实验性的,这意味着它可能还有机会。对于
std::vector
,我可能使用
resize(42)
,而不是指定初始容量。使用
my_array(42)
,我会担心人们会认为
42
是一个初始元素,或者甚至会将其更改为
my_array{42}
,然后默默地破坏一些东西。这样做的一个小问题是,它用零填充向量,而您示例中的数组声明使其未初始化。如果期望向量的大小较大,这可能很重要。我想说,在大多数情况下,调用
reserve
与其说是为了保证加速(这意味着省略调用时STL“保证减速”),不如说是为了在简单和明显的情况下选择较短的解决方案。通常,在分配时,您知道向量将变得多大,即使出于某种原因,您无法将其构造为该大小,但需要重复
推回
以填充它。那么,不调用
reserve
就像在找到匹配项时不中断线性搜索一样愚蠢;当然,加速可能很小,但改进是显而易见的。