在std :: vector <std :: vector <type>&gt;

时间:2018-05-14 07:41:17

标签: c++ c++11 vector memory-management

我喜欢为std::vector<std::vector<TYPE>>中的内部向量保留内存,以避免在后续push_back期间进行大量单个内存分配。我并不完全了解向量的innerSize,但我可以给出一个很好的估计。

std::resize可以用作

vecs.resize(outerSize, std::vector<TYPE>(innerSize));

其中outerSizeinnerSize被赋予整数。这对我不起作用,因为默认构造函数不适用。但是std::reserve不提供这样的界面。

这是为所有内部向量保留记忆的好方法吗?

vecs.resize(outerSize);
for (auto &elem : vecs) {
    elem.reserve(innerSize);
}

2 个答案:

答案 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