如果我有一个包含另一个类的向量的类,我希望它很长:
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.
}
谢谢, 本。
答案 0 :(得分:1)
所有vector
都在堆上并动态分配。你声明它的方式很好,但你可能应该在你的构造函数中初始化它。
NucleotideSequence
...我下注这是一个很大的阵容。
答案 1 :(得分:1)
我认为最好将变量成员Sequence
保留为std::vector
(而不是pointer
到std::vector
)。正如您所提到的“向量包装动态数组分配”:std::vector
以RAII
方式为您管理内存(堆分配/释放/重新分配):
当您写下:std::vector<Nucleotide> Sequence
时,Sequence
将对象Nucleotide
存储在heap
上(不在stack
上)
一个建议:在你的构造函数中,你传递std::vector
的值(以及std::string
)。如果您的std::vector
尺寸较大,则按价值传递费用很高。您需要考虑是否可以在您的案例中应用通过引用传递。
答案 2 :(得分:0)
是的,包装整个动态分配的数组。 你不需要动态分配一个,这通常是错误的。只需将它们声明为您拥有的直接数据成员。
但是,向量使用值语义,因此这样做有可能存在缺点,因为复制/赋值的结果类非常昂贵(很像复制/赋值的大向量代价很高)。 / p>
这通常很好,它只是使它成为一个大的东西,并且通常在传递它们时通过引用传递大的东西,因此请确保通过引用传递序列,而不是通过值传递它。 (当然,你没有提供copy-ctr / assignment操作符,所以无论如何你都可能会这样做)