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

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

C ++中的a std::vector和a有什么区别std::array?什么时候应该优先于另一个?各自的优点和缺点是什么?我的所有教科书都列出了它们是如何相同的。



慕森卡
浏览 1503回答 3
3回答

Qyouu

为了强调@MatteoItalia提出的观点,效率差异是存储数据的地方。堆内存(需要vector)需要调用系统来分配内存,如果计算周期,这可能会很昂贵。堆栈存储器(可能array)在时间上实际上是“零开销”,因为仅通过调整堆栈指针来分配存储器,并且在进入函数时仅执行一次。堆栈还避免了内存碎片。可以肯定的是,std::array并不总是在堆栈上; 它取决于你分配它的位置,但与vector相比,它仍然会减少堆中的内存分配。如果你有小的“数组”(在100个元素之下) - (一个典型的堆栈大约是8MB,所以如果你的代码是递归的,不要在堆栈上分配超过几KB或更少)大小将是固定的生命周期在函数范围内(或者是与父类具有相同生命周期的成员值)你在计算周期,绝对使用std::array一个矢量。如果这些要求中的任何一个不成立,那么使用a std::vector。

翻阅古今

如果您正在考虑使用多维数组,那么std :: array和std :: vector之间还有一个区别。多维std :: array将在所有维度中将元素打包在内存中,就像交流样式数组一样。多维std :: vector不会在所有维度中打包。鉴于以下声明:int&nbsp;cConc[3][5];std::array<std::array<int,&nbsp;5>,&nbsp;3>&nbsp;aConc;int&nbsp;**ptrConc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;initialized&nbsp;to&nbsp;[3][5]&nbsp;via&nbsp;new&nbsp;and&nbsp;destructed&nbsp;via&nbsp;deletestd::vector<std::vector<int>>&nbsp;vConc;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;initialized&nbsp;to&nbsp;[3][5]指向c样式数组(cConc)或std :: array(aConc)中第一个元素的指针可以通过向每个前面的元素添加1来遍历整个数组。他们紧紧包装。指向向量数组(vConc)或指针数组(ptrConc)中第一个元素的指针只能通过前5个(在本例中)元素迭代,然后有12个字节(在我的系统上)用于下一个矢量。这意味着初始化为[3] [1000]数组的std :: vector>数组的内存将小于作为[1000] [3]数组初始化的数组,并且内存中的数据都比std更大:数组分配方式。这也意味着你不能简单地将一个多维向量(或指针)数组传递给openGL而不考虑内存开销,但是你可以天真地将多维std :: array传递给openGL并让它运行起来。
打开App,查看更多内容
随时随地看视频慕课网APP