我有一个std::array
,其中numLines = 4
的数字固定(std::vector
);每个std::vector
将包含动态数量的元素,我知道每个std::vector
(numMaxSteps = 32)
的最大大小。
因此:
std::array<std::vector<int>, numLines> mSequences;
由于我正在以更高的速率处理音频,因此它强制我从不在此过程中分配内存(因此,它会引入喀哒声和毛刺)。
但是我不确定如何在初始化时reserve
来存储每个std::vector
。
有办法吗?还是我需要迭代std::array
的每个项目并执行.reserve(numMaxSteps)
?
请注意,我需要将.size()
保持为0:只有.capacity()
需要长大。
答案 0 :(得分:1)
如果不介意在访问向量时再写几个字母,也可以创建一个薄包装器:
function createIndexFrame(dbObject,collectionName, callback)
{
dbObject.collection(collectionName).createIndex({frame:1},function(err, res) {
if (err) throw err;
callback();
});
}
答案 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的概念违反了您的编码标准,您总是可以使用它来创建一个命名的自由函数。
答案 2 :(得分:0)
有办法吗?还是我需要迭代
std::array
的每个项目并执行.reserve(numMaxSteps)
?
就是这样;-)
但是我同意@bartop;根据您的需要,您应该考虑使用array<array<int, 32>>
。
答案 3 :(得分:0)
您在这里描述的内容似乎是boost.static_vector的完美案例。
此容器允许您预分配编译时大小,但此后它支持push()
/ pop()
/ insert()
/ remove()
等,它是{{1 }}函数和迭代器遵守实际运行时定义的大小。