我有 N 乘 4 的数据,我按如下方式返回数据。
vector<vector<int>> a;
for(some loop){
...
a.push_back(vector<int>(4){val1,val2,val3,val4});
}
N会小于13000,为了防止不必要的重新分配,我想提前4个位预留13000。
在阅读了有关该主题的多篇相关文章后(例如 How to reserve a multi-dimensional Vector? ),我知道以下内容可以完成工作。但我想使用 reserve() 或任何类似函数(如果有的话),以便能够使用 push_back()
。
vector<vector<int>> a(13000,vector<int>(4);
或
vector<vector<int>> a;
a.resize(13000,vector<int>(4));
如何在不增加 vector 大小的情况下只保留内存?
最佳答案
如果您的数据保证为 N x 4,您不想使用 std::vector<std::vector<int>>
,而是类似 std::vector<std::array<int, 4>>
的东西.
为什么?
- 这是语义上更准确的类型 -
std::array
专为固定宽度的连续数据序列而设计。 (它还打开了编译器进行更多性能优化的潜力,尽管这取决于您正在编写的内容。) - 您的数据将在内存中连续布局,而不是每个不同的 vector 分配可能不同的堆位置。
话虽如此 - @pasbi 的回答是正确的:您可以使用 std::vector::reserve()
在插入任何实际元素之前为外部 vector 分配空间(对于 vector vector 和数组 vector )。此外,稍后,您可以使用 std::vector::shrink_to_fit()
方法,如果你最终插入的数量比你计划的少很多。
最后,另一种选择是使用 gsl::multispan
并为其预分配内存(GSL 是 C++ 核心指南支持 Library )。
关于c++ - 如何在不增加 vector 大小的情况下保留多维 vector ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57542919/