我有一个很大的遗传数据集(X,Y坐标),我可以在运行时轻松地知道一个维度(X)。
我为矩阵类起草了以下代码,该类允许指定一个维度的大小,但通过实现std::vector
使另一个维度保持动态。每个向量都使用new
d unique_ptr
,它嵌入在C风格array
中,也包含new
和unique_ptr
。
class Matrix
{
private:
typedef std::vector<Genotype> GenVec;
typedef std::unique_ptr<GenVec> upGenVec;
std::unique_ptr<upGenVec[]> m;
unsigned long size_;
public:
// ...
// construct
Matrix(unsigned long _size): m(new upGenVec[_size]), size_(_size)
{
for (unsigned long i = 0; i < this->size_; ++i)
this->m[i] = upGenVec(new GenVec);
}
};
我的问题:
使用此而不是std::vector< std::vector<Genotype> >
吗?
我在这个实现背后的理由是,我只需要一个维度是动态的,而另一个维度是固定的。使用std::vector
可能意味着需要更多的内存分配。由于我正在处理估计约50GB内存的数据,我想尽可能多地控制内存分配。
或者,有更好的解决方案吗?
答案 0 :(得分:1)
我不会引用规范中的任何段落,但我非常确定std::vector
内存开销是固定的,即它并不依赖于它包含的元素数量。所以我说你的C风格阵列的解决方案实际上更糟糕,因为你分配的内容(不包括实际数据)是:
在vector<vector<...>>
解决方案中,您分配的是: