数组或向量

Arrays Or Vectors?

本文关键字:向量 数组      更新时间:2023-10-16

可能的重复项:
什么时候使用数组而不是向量/字符串?
std::array 和 std::vector 有什么区别?你什么时候使用一个而不是另一个?

总是使用向量(动态数组)做所有事情,我从不使用普通数组,这有什么缺点吗,例如,会有向量不适合的时候,而普通数组会适合函数吗?

根据Bjarne Stroustrup的说法,你应该使用Array over Array,除非你有很好的理由使用数组。

在几乎所有情况下,vector都是可取的。它的内存是从免费存储中分配的(专为大量分配而设计)并自动管理;如果需要,您可以轻松获取指向数组本身的指针。

在以下情况下,您将使用数组(内置或std::array):

  • 数组大小在编译时是已知的,并且不会大到可能会破坏堆栈;和
  • 阵列具有固定的作用域;并且
  • 动态分配会导致运行时成本过高或堆碎片等问题,并且您不希望使用自定义分配器来解决这些问题。

Vector 是一个动态增长的数组。而数组是静态的。您必须在开始时定义一个数组,并且不能重新分配。对于向量,您没有声明固定大小的限制。您可以从一个空向量开始,并根据需要保持其增长。到目前为止,我从未发现任何更适合阵列的情况。事实上,我发现使用向量可以解决我在数组中面临的许多问题。我认为始终使用向量是一种非常好的做法。

继续这样做!!!

使用最适合您情况的任何内容,我在下面通过一个小例子概述了我最喜欢的固定大小数组的好处之一。

如果您的大小未知,或者可能需要在运行时增加存储,则需要寻找矢量。

如果你有一个预定的大小,你可以使用std::array甚至一个原始的C数组(int foo[256]),它在代码简单性和速度方面有好处。这里最好的好处之一是,如果要存储在数组中的数据是已知的,那么您可以使用 C 样式初始化器列表,消除向量可能发生的任何设置成本,并为优化器打开空间,使事情更快,同时也更容易调试:

struct KeyPair { int key; string name; }; 
const KeyPair kFoo[] = { { 0, "0" }, { 1, "1" }, { 2, "2" } };
const string& getName( unsigned int key )
{
assert( key < (sizeof(kFoo)/sizeof(*kFoo)) ); // Check key is a valid index
assert( kFoo[key].key == key ); //< Sanity check - useful is key is an enum which could change
return kFoo[key];
}