动态分配类中的向量

时间:2013-11-23 00:16:05

标签: c++ class vector dynamic-memory-allocation

如果我有一个包含另一个类的向量的类,我希望它很长:

class NucleotideSequence{
private:
    std::string Name;
    std::vector<Nucleotide> Sequence;
public:
    NucleotideSequence();
    NucleotideSequence(std::string name, std::vector<Nucleotide> seq);
    std::string getName();
    Nucleotide* getBase(int pos1);
    int getLength();
    void print();
};

在这种情况下,向量序列,我是否需要通过在构造函数中创建Sequence * Sequence并创建一个新向量来动态分配它?我想确保为大型向量(超过数十万个元素)使用正确的资源(堆栈与堆)。哪个是正确的做法?我听说矢量包装动态数组分配。

编辑:

我已经提供了下面的更新代码,以显示我已经使用了构造函数的引用传递。我希望也使用移动构造函数,这样我就可以在函数中创建这些对象,然后将它们移到外面。

还给出了更新的getPos方法,如果序列中不存在该位置,则会抛出错误。

class NucleotideSequence{
private:
    std::string Name;
    std::vector<Nucleotide> Sequence;
public:
    NucleotideSequence();
    NucleotideSequence(const std::string &name, const std::vector<Nucleotide> &seq); // Note that a pointer is not needed since the std::vector class allocated memory on the heap for us and is a wrapper for that whole RAII process.
    std::string getName();
    Nucleotide getBase(int pos);
    int getLength();
    void print();
};

NucleotideSequence::NucleotideSequence(const std::string &name, const std::vector<Nucleotide> &seq)
{
    Name = name;
    Sequence = seq;
}

// Get a specific base
Nucleotide NucleotideSequence::getBase(int pos)
{
    for(std::vector<Nucleotide>::iterator i = Sequence.begin(); i != Sequence.end(); i++)
    {
        if(pos == i->getPos())
        {
            return *i; // Return the correct nucleotide object.
        }
    }
    throw BoundsError(); // If the desired position is not found, throw the error.
}

谢谢, 本。

3 个答案:

答案 0 :(得分:1)

所有vector都在堆上并动态分配。你声明它的方式很好,但你可能应该在你的构造函数中初始化它。

NucleotideSequence ...我下注这是一个很大的阵容。

答案 1 :(得分:1)

我认为最好将变量成员Sequence保留为std::vector(而不是pointerstd::vector)。正如您所提到的“向量包装动态数组分配”:std::vectorRAII方式为您管理内存(堆分配/释放/重新分配):
当您写下:std::vector<Nucleotide> Sequence时,Sequence将对象Nucleotide存储在heap上(不在stack上)

一个建议:在你的构造函数中,你传递std::vector的值(以及std::string)。如果您的std::vector尺寸较大,则按价值传递费用很高。您需要考虑是否可以在您的案例中应用通过引用传递。

答案 2 :(得分:0)

是的,包装整个动态分配的数组。 你不需要动态分配一个,这通常是错误的。只需将它们声明为您拥有的直接数据成员。

但是,向量使用值语义,因此这样做有可能存在缺点,因为复制/赋值的结果类非常昂贵(很像复制/赋值的大向量代价很高)。 / p>

这通常很好,它只是使它成为一个大的东西,并且通常在传递它们时通过引用传递大的东西,因此请确保通过引用传递序列,而不是通过值传递它。 (当然,你没有提供copy-ctr / assignment操作符,所以无论如何你都可能会这样做)