2014-09-29 43 views
1

我有一个很大的遗传数据集(X,Y坐标),其中我可以很容易地知道运行时的一个维度(X)。C++ ::二维矩阵,在一维中动态使用unique_ptr?

我为矩阵类起草了以下代码,它允许指定一个维度的大小,但通过实现std::vector而使另一个维度保持动态。每个载体是使用unique_ptrnew'd,其被嵌入在C型array中,还有newunique_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的RAM,所以我想尽可能地控制内存分配。

或者,有没有更好的解决方案?

+0

我必须补充一点,我是'unique_ptr'的新手。因此,我很想探索它,但不能说这是否会按预期工作。 – Stingery 2014-09-29 16:44:24

+0

如果你想确保你的第一维不会被改变,你可以使用std :: array。 – danadam 2014-09-29 16:55:31

+0

我只在运行时在编译期间不知道这个维度的大小。矩阵在两个维度上都是动态的,但其中一个在运行时得到修复。 – Stingery 2014-09-29 16:58:31

回答

1

我不会引用规范中的任何段落,但我很肯定std::vector的内存开销是固定的,即它不依赖于它包含的元素的数量。所以,我要说与C风格的阵列解决方案实际上是更糟糕的记忆,明智的,因为你分配什么,不包括实际数据是:

  • N * pointer_size(第一维数组)
  • N * vector_fixed_size (第二维向量)

vector<vector<...>>溶液你分配什么是:

  • 1 * vector_fixed_size(第一维向量)
  • N * vector_fixed_size(第二维向量)
+0

我认为'vector >'解决方案在内存方面会更差,因为第一维容量可能比所需要的大。我知道运行时的第一维尺寸,并希望解决它,只有第二维能力是动态的;即总是有X行,但列数Y是未知的。 – Stingery 2014-10-02 10:40:46

+0

如果你向第一维向量push_back()N次并让它自动增长,那么是的,它可能会预留比需要更多的内存。但是如果你在那些N push_back()之前调用'reserve(N)',或者甚至调用'resize(N)'而不是N'push_back()',那么向量应该只用内存量来存放N个元素,不多。 – danadam 2014-10-02 11:02:29