我有一个std::array
固定数量(numLines = 4
)的std::vector
;每个std::vector
将包含动态数量的元素,我知道每个std::vector
的最大大小(numMaxSteps = 32)
。
从而:
std::array<std::vector<int>, numLines> mSequences;
由于我正在以更高的速率处理音频,因此我必须在此过程中永远不分配内存(因此,它会引入咔嗒声和毛刺)。
但我不知道如何在init上对每个reserve
的std::vector
记忆。
有办法吗?或者我需要迭代std::array
和do.reserve(numMaxSteps)
的每一项?
请注意,我需要将.size()
保持在0:只有.capacity()
需要长大。
如果您在访问向量时不介意再写几个字母,也可以创建一个瘦包装器:
struct vect32 {
vect32() : vect(32) {}
vector<int> vect;
};
array<vect32, 10> sequences;
sequences[0].vect.push_back(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的函数。
有办法吗?或者我需要迭代
std::array
的每个项目并做.reserve(numMaxSteps)
?
就是那样 ;-)
但我同意@bartop;根据您的需求,您应该考虑使用array<array<int, 32>>
。
你在这里描述的似乎是boost.static_vector的完美案例。
这个容器允许你预先分配编译时大小,但之后它支持push()
/ pop()
/ insert()
/ remove()
等,它的size
函数和迭代器遵循实际运行时定义的大小。