如果我有一个包含另一个类的向量的类,并且我希望它很长:
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并在构造函数中创建一个新向量来动态分配它?我想确保对大型矢量(超过数十万个元素)使用正确的资源(堆栈还是堆)。正确的做法是?我听说向量包装了动态数组分配。
编辑:
我在下面提供了更新的代码,以显示我已使用构造函数的引用传递。我希望也可以使用move构造函数,以便可以在函数中创建这些对象,然后将其移到外部。
还提供了更新的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.
}
谢谢,本
我要说的是,最好将变量成员保留Sequence
为std::vector
(而不是pointer
to std::vector
)。正如您提到的“向量包装动态数组分配”:通过std::vector
以下方式为您管理内存(堆分配/释放/重新分配)RAII
:
写时std::vector<Nucleotide> Sequence
,Sequence
将对象存储Nucleotide
在heap
(而不是stack
)上
一个建议:在构造函数中,您要传递std::vector
按值(以及std::string
)。如果您的std::vector
公司规模很大,那么按价值传递价格昂贵。您需要考虑是否可以在您的情况下应用引用传递。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句