使用数组而不是std :: vector的优点?

时间:2010-10-23 12:46:47

标签: c++ arrays stl coding-style vector

我目前看到很多标记为C ++的问题,并且是关于处理数组的问题 甚至还有一些问题会询问数组的方法/特征,而std::vector会提供这些方法/特征而没有任何魔力。

所以我想知道为什么这么多开发人员在C ++中使用std::vector选择数组?

5 个答案:

答案 0 :(得分:9)

一般来说,我更倾向于使用数组上的向量来进行非平凡的工作;但是,阵列有一些优点。

  • 数组稍微紧凑:大小是隐式的
  • 数组不可调整大小;有时这是可取的
  • 数组不需要解析额外的STL头(编译时)
  • 使用数组与直接C代码交互更容易(例如,如果C正在分配而C ++正在使用)
  • 固定大小的数组可以直接嵌入到结构或对象中,这可以改善内存局部性并减少所需的堆分配数

答案 1 :(得分:4)

因为C ++ 03没有矢量文字。使用数组有时会产生更简洁的代码。

与数组初始化相比:

char arr[4] = {'A', 'B', 'C', 'D'};

向量初始化看起来有点冗长

std::vector<char> v;
v.push_back('A');
v.push_back('B');
...

答案 2 :(得分:2)

我会选择在C ++ 0x中使用std :: array而不是普通数组,这些数组也可以像带有初始化列表的标准数组一样进行初始化

https://en.cppreference.com/w/cpp/container/array

答案 3 :(得分:1)

我认为这是因为许多C ++程序员来自C并且还不了解使用vector和使用其容器免费提供的所有额外STL好东西的优点。

答案 4 :(得分:1)

您可以使用数组进行更多控制

怎么样:

1)您正在处理庞大的数据集,其中数据必须映射文件,而不是由mallocnew分配,因为它的大小。在这种情况下担心如果你在开始时没有预留足够的地址空间该怎么办可能没有实际意义,尽管我认为你可以取消映射 - 扩展 - 重新映射文​​件,除非地址碎片或我的第二点禁止。

2)使用无锁多处理的代码。停止线程重新分配(或任何其他“STL goodie”)的性能命中可能是不可接受的,因此使用数组,你有更多的控制权,你可能需要调用很多函数来在调整大小之前暂停其他线程任何东西。

顺便说一下,我通常会同时处理1和2。结构和指针的数组非常有效,使用C ++进行编译,因为您仍然可以在代码中的其他地方使用某些C ++特性。如果我努力的话,我相信我能想到更多的例子