【问题标题】:C++ :: two-dimensional matrix, dynamic in one dimension, using unique_ptr?C++ :: 二维矩阵,一维动态,使用unique_ptr?
【发布时间】:2014-11-24 03:13:52
【问题描述】:

我有一个大型基因数据集(X、Y 坐标),在运行时我可以很容易地知道其中的一维 (X)。

我为一个矩阵类起草了以下代码,它允许指定一维的大小,但通过实现std::vector 使另一维保持动态。每个向量都是new,使用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&lt; std::vector&lt;Genotype&gt; &gt;有意义吗?

我在这个实现背后的原因是我只需要一个维度是动态的,而另一个应该是固定的。使用std::vectors 可能意味着比需要更多的内存分配。由于我正在处理可能会填满大约 50GB RAM 的数据,因此我想尽可能多地控制内存分配。

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

【问题讨论】:

  • 我必须补充一点,我是unique_ptr 的新手。因此,我很想探索它,但不能说这是否会按预期工作。
  • 如果你想确保你的第一个维度不会被改变,你可以使用 std::array。
  • 我不知道编译时一维的大小,只知道运行时。从某种意义上说,矩阵在两个维度上都是动态的,但其中一个在运行时会得到固定。
  • 我觉得这是流程问题,不是编码问题。你能解释一下你从开始到结束的过程吗?您从哪里获取数据(用户输入、文件、数据库等)?为什么它在一个巨大的矩阵中?程序如何运行(命令行、正在进行等)?您希望如何处理矩阵数据(操作、分析等)?
  • 流程如下: (1) 从文件中读取数据,逐行,解析行元素放入向量中。它们的大小在运行时总是相同的(这就是为什么我可以通过读取第一行知道一个维度)(2)矩阵充满了行元素,但是:每一行都是一列,并且有很多行未知。在矩阵中,列变为行 (3),然后迭代每个矩阵行,这是处理的大部分。矩阵不会在列上迭代

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


【解决方案1】:

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

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

vector&lt;vector&lt;...&gt;&gt; 解决方案中,您分配的是:

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

【讨论】:

  • 我认为vector&lt;vector&lt;...&gt;&gt; 解决方案在内存方面会更差,因为第一维容量可能比所需的大。我知道运行时的第一维大小并想修复它,只有第二维容量是动态的;也就是说,总会有 X 行,但列数 Y 是未知的。
  • 如果你push_back() N 次到第一维向量并让它自动增长然后是的,它可能会保留比需要更多的内存。但是如果你在那些 N push_back() 之前调用 reserve(N) 或者甚至调用 resize(N) 而不是 N push_back() 那么向量应该只使用存储 N 个元素的内存量而不是更多。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2016-08-13
  • 2012-01-22
  • 2021-03-03
  • 2013-06-19
  • 2011-12-11
  • 2020-03-19
  • 1970-01-01
相关资源
最近更新 更多