为了账号安全,请及时绑定邮箱和手机立即绑定

在C ++中std :: vector与std :: array

在C ++中std :: vector与std :: array

C++
慕森卡 2019-08-23 16:34:30
在C ++中std :: vector与std :: arrayC ++中的a std::vector和a有什么区别std::array?什么时候应该优先于另一个?各自的优点和缺点是什么?我的所有教科书都列出了它们是如何相同的。
查看完整描述

3 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

为了强调@MatteoItalia提出的观点,效率差异是存储数据的地方。堆内存(需要vector)需要调用系统来分配内存,如果计算周期,这可能会很昂贵。堆栈存储器(可能array)在时间上实际上是“零开销”,因为仅通过调整堆栈指针来分配存储器,并且在进入函数时仅执行一次。堆栈还避免了内存碎片。可以肯定的是,std::array并不总是在堆栈上; 它取决于你分配它的位置,但与vector相比,它仍然会减少堆中的内存分配。如果你有

  • 小的“数组”(在100个元素之下) - (一个典型的堆栈大约是8MB,所以如果你的代码是递归的,不要在堆栈上分配超过几KB或更少)

  • 大小将是固定的

  • 生命周期在函数范围内(或者是与父类具有相同生命周期的成员值)

  • 你在计算周期,

绝对使用std::array一个矢量。如果这些要求中的任何一个不成立,那么使用a std::vector


查看完整回答
反对 回复 2019-08-23
?
翻阅古今

TA贡献1780条经验 获得超5个赞

如果您正在考虑使用多维数组,那么std :: array和std :: vector之间还有一个区别。多维std :: array将在所有维度中将元素打包在内存中,就像交流样式数组一样。多维std :: vector不会在所有维度中打包。

鉴于以下声明:

int cConc[3][5];std::array<std::array<int, 5>, 3> aConc;int **ptrConc;      // initialized to [3][5] via new and destructed via deletestd::vector<std::vector<int>> vConc;    // initialized to [3][5]

指向c样式数组(cConc)或std :: array(aConc)中第一个元素的指针可以通过向每个前面的元素添加1来遍历整个数组。他们紧紧包装。

指向向量数组(vConc)或指针数组(ptrConc)中第一个元素的指针只能通过前5个(在本例中)元素迭代,然后有12个字节(在我的系统上)用于下一个矢量。

这意味着初始化为[3] [1000]数组的std :: vector>数组的内存将小于作为[1000] [3]数组初始化的数组,并且内存中的数据都比std更大:数组分配方式。

这也意味着你不能简单地将一个多维向量(或指针)数组传递给openGL而不考虑内存开销,但是你可以天真地将多维std :: array传递给openGL并让它运行起来。


查看完整回答
反对 回复 2019-08-23
  • 3 回答
  • 0 关注
  • 1498 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信