【发布时间】:2014-11-24 03:13:52
【问题描述】:
我有一个大型基因数据集(X、Y 坐标),在运行时我可以很容易地知道其中的一维 (X)。
我为一个矩阵类起草了以下代码,它允许指定一维的大小,但通过实现std::vector 使另一维保持动态。每个向量都是new,使用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::vectors 可能意味着比需要更多的内存分配。由于我正在处理可能会填满大约 50GB RAM 的数据,因此我想尽可能多地控制内存分配。
或者,有更好的解决方案吗?
【问题讨论】:
-
我必须补充一点,我是
unique_ptr的新手。因此,我很想探索它,但不能说这是否会按预期工作。 -
如果你想确保你的第一个维度不会被改变,你可以使用 std::array。
-
我不知道编译时一维的大小,只知道运行时。从某种意义上说,矩阵在两个维度上都是动态的,但其中一个在运行时会得到固定。
-
我觉得这是流程问题,不是编码问题。你能解释一下你从开始到结束的过程吗?您从哪里获取数据(用户输入、文件、数据库等)?为什么它在一个巨大的矩阵中?程序如何运行(命令行、正在进行等)?您希望如何处理矩阵数据(操作、分析等)?
-
流程如下: (1) 从文件中读取数据,逐行,解析行元素放入向量中。它们的大小在运行时总是相同的(这就是为什么我可以通过读取第一行知道一个维度)(2)矩阵充满了行元素,但是:每一行都是一列,并且有很多行未知。在矩阵中,列变为行 (3),然后迭代每个矩阵行,这是处理的大部分。矩阵不会在列上迭代
标签: c++11 matrix vector new-operator unique-ptr