我喜欢为std::vector<std::vector<TYPE>>
中的内部向量保留内存,以避免在后续push_back
期间进行大量单个内存分配。我并不完全了解向量的innerSize
,但我可以给出一个很好的估计。
std::resize
可以用作
vecs.resize(outerSize, std::vector<TYPE>(innerSize));
其中outerSize
和innerSize
被赋予整数。这对我不起作用,因为默认构造函数不适用。但是std::reserve
不提供这样的界面。
这是为所有内部向量保留记忆的好方法吗?
vecs.resize(outerSize);
for (auto &elem : vecs) {
elem.reserve(innerSize);
}
答案 0 :(得分:5)
我能想到的唯一选择是你在内部std::vector
周围创建一个包装类;它保留在建设中。导致像
struct TableRow {
std::vector<TYPE> data;
TableRow() {
data.reserve(SIZE);
}
}
std::vector<TableRow> myVectorOfVectors;
这样做的另一个好处是你的内部向量得到了一个你能理解的名字(比如TableRow
);但缺点是,除非你愿意参加继承游戏std::vector
(如果有疑问,不要这样做);你对包装类的使用必须有点尴尬,因为你需要添加.data
或类似的东西。
正如其他人所说的那样;你的方式非常好。
答案 1 :(得分:3)
是的,如果不是最好的话,你的尝试是一个很好的解决方案:
#include <vector>
std::vector<std::vector<NonDefaultConstructible>> vecs;
vecs.resize(outerSize);
for (auto &elem : vecs) {
elem.reserve(innerSize);
}
改进它的唯一方法是需要std::vector
的构造函数,它将接受一个容量并构造一个大小为零且提供容量的向量。这样的构造函数does not exist。