2014-09-29 68 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