2

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

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

4

4 回答 4

4

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

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

  • 数组大小在编译时是已知的,并且不会太大以至于可能会破坏堆栈;和
  • 数组有固定的范围;和
  • 动态分配会导致过多的运行时成本或堆碎片等问题,您不希望使用自定义分配器来解决这些问题。
于 2013-01-23T12:25:07.707 回答
4

根据Bjarne Stroustrup的说法,除非您有充分的理由使用数组,否则您应该在数组上使用向量。

于 2013-01-23T12:18:11.657 回答
2

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

继续做!!!!

于 2013-01-23T12:19:54.183 回答
0

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

如果您的大小未知或可能需要在运行时增加存储空间,您将寻找向量。

如果您有预定的大小,您可以使用 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];
}
于 2013-01-23T12:46:13.477 回答