如何在不增加向量大小的情况下保留多维向量?

C.O*_*ark 0 c++ stdvector multidimensional-array c++11

我有N乘以4的数据,如下所示将数据推回去。

vector<vector<int>> a;
for(some loop){
   ...
   a.push_back(vector<int>(4){val1,val2,val3,val4});
}
Run Code Online (Sandbox Code Playgroud)

N小于13000。为防止不必要的重新分配,我想提前4个空间保留13000。

在阅读了有关该主题的多个相关文章(例如,如何保留多维向量?)之后,我知道以下将完成工作。但是我想使用reserve()或任何类似的函数(如果有)来使用它push_back()

vector<vector<int>> a(13000,vector<int>(4);
Run Code Online (Sandbox Code Playgroud)

要么

vector<vector<int>> a;
a.resize(13000,vector<int>(4));
Run Code Online (Sandbox Code Playgroud)

如何仅保留内存而不增加向量大小?

pas*_*sbi 6

您已经回答了自己的问题。有一个功能vector::reserve可以完全满足您的需求。

vector<vector<int>> a;
a.reserve(N);
for(some loop){
   ...
   a.push_back(vector<int>(4){val1,val2,val3,val4});
}
Run Code Online (Sandbox Code Playgroud)

这将保留内存以适应N时间vector<int>。注意,此时内部的实际大小vector<int>是无关紧要的,因为向量的数据被分配在其他地方,只有指针和一些簿记存储在实际的std::vector-class中。


ein*_*ica 6

如果您的数据是保证为N×4,你希望使用std::vector<std::vector<int>>,而是像std::vector<std::array<int, 4>>

为什么?

  • 它是语义上更准确的类型- std::array专为固定宽度的连续数据序列而设计。(尽管这完全取决于您要编写的内容,但它也为编译器提供了更多性能优化的潜力。)
  • 您的数据将连续放置在内存中,而不是每个不同的向量都可能分配不同的堆位置。

话虽这么说-@pasbi的答案是正确的:您可以std::vector::reserve()在插入任何实际元素(用于vectors-of-vectors和vectors-of-arrays)之前为外部vector分配空间。另外,以后,std::vector::shrink_to_fit()如果插入的内容比计划的要少得多,则可以使用该方法。

最后,另一个选择是使用gsl::multispan并为其预分配内存(GSL是C ++核心准则支持)。