C ++ ::二维矩阵,一维动态,使用unique_ptr?

时间:2014-09-29 16:39:36

标签: c++11 matrix vector new-operator unique-ptr

我有一个很大的遗传数据集(X,Y坐标),我可以在运行时轻松地知道一个维度(X)。

我为矩阵类起草了以下代码,该类允许指定一个维度的大小,但通过实现std::vector使另一个维度保持动态。每个向量都使用new d unique_ptr,它嵌入在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内存的数据,我想尽可能多地控制内存分配。

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

1 个答案:

答案 0 :(得分:1)

我不会引用规范中的任何段落,但我非常确定std::vector内存开销是固定的,即它并不依赖于它包含的元素数量。所以我说你的C风格阵列的解决方案实际上更糟糕,因为你分配的内容(不包括实际数据)是:

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

vector<vector<...>>解决方案中,您分配的是:

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