如何为std :: array中的std :: vectors保留内存?

问题描述 投票:0回答:4

我有一个std::array固定数量(numLines = 4)的std::vector;每个std::vector将包含动态数量的元素,我知道每个std::vector的最大大小(numMaxSteps = 32)

从而:

std::array<std::vector<int>, numLines> mSequences;

由于我正在以更高的速率处理音频,因此我必须在此过程中永远不分配内存(因此,它会引入咔嗒声和毛刺)。

但我不知道如何在init上对每个reservestd::vector记忆。

有办法吗?或者我需要迭代std::array和do.reserve(numMaxSteps)的每一项?

请注意,我需要将.size()保持在0:只有.capacity()需要长大。

c++ vector memory-management stl containers
4个回答
1
投票

如果您在访问向量时不介意再写几个字母,也可以创建一个瘦包装器:

struct vect32 {
    vect32() : vect(32) {}
    vector<int> vect;
};

array<vect32, 10> sequences;

sequences[0].vect.push_back(1);

1
投票

根据您对马歇尔答案的评论推断:

我只需要一种“花哨”的方式来保留init上的内存

它没有比IILE更加漂亮:

auto mSequences = []{
  std::array<std::vector<int>, nunLines> ret;
  for (auto& v : ret)
    v.reserve(maxCapacity);
  return ret;
}();

当初始化mSequences时,lambda将被自动调用,并且由于NRVO的奇迹将直接初始化它。

它甚至可以用于初始化声明为const的复杂对象。

如果IILE的想法违反了您的编码标准,您总是可以使用它来创建一个名为free的函数。


0
投票

有办法吗?或者我需要迭代std::array的每个项目并做.reserve(numMaxSteps)

就是那样 ;-)

但我同意@bartop;根据您的需求,您应该考虑使用array<array<int, 32>>


0
投票

你在这里描述的似乎是boost.static_vector的完美案例。

这个容器允许你预先分配编译时大小,但之后它支持push() / pop() / insert() / remove()等,它的size函数和迭代器遵循实际运行时定义的大小。

© www.soinside.com 2019 - 2024. All rights reserved.