c++ - 如何在不增加 vector 大小的情况下保留多维 vector ?

标签 c++ c++11 multidimensional-array stdvector

我有 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/

相关文章:

java - 如何在 Java 中打印二维数组中的最大值路径?

C++ 多维数组成员访问器

c++ - Boost.Python - 如何重新进入模块范围?

c++ - 使用 QNetwork 时的奇怪警告

c++ - 有没有办法避免以下代码中的内存泄漏?

c++11 - 迭代 c++11 std::array 的前 N ​​个元素

C语言错误输出...使用二维数组的pascal三角形

c++ - 如何在三元运算符中打破 for 循环

c++ - 有没有办法关闭 boost 日期和时间验证

C++ 返回对象的引用