我想初始化一个尺寸为3xNmax的2D矢量(一个类中的私有),Nmax将在main(类外)中分配。
其实我有:
class Particle
{
public:
Particle();
void setNmax(float Nmax){
_Nmax=Nmax; // this method is actually useless: _Nmax is set below
}
private:
int _Nmax=30000; // The parameter I want to set from outside
vector<vector<float> > _x{3, vector<float> (_Nmax)}; //the 2D vector to be initialized
我是否需要在构造函数中移动声明和初始化?
EDIT1:谢谢你的回答。关于我不需要使用变量_Nmax的事实,(因为向量带有它自己的大小),我认为在开始时声明具有一定固定大小(Nmax)的向量并且避免在向量期间调整它的大小。代码执行会使我的代码运行得更快而不是多次使用“push_back”这个假设是否正确?
答案 0 :(得分:1)
使用成员初始化列表:
#include <vector>
class Particle
{
public:
Particle(size_t Nmax = 30000) : xVect(3, std::vector<float>(Nmax)) {}
private:
vector<vector<float> > xVect;
};
此外,不需要携带无关的成员变量_nMax
来表示向量中的元素数量。向量通过调用vector::size()
函数知道自己的大小。
引入额外的变量来完成这项工作会增加错误发生的可能性,因为如果向量更改大小,就会忘记更新此变量。
此外,使用下划线启动变量不是一个好主意。带有下划线的名称是为系统库代码保留的。
答案 1 :(得分:1)
#include <vector>
class Particle
{
public:
Particle(std::size_t nmax = 30000)
: _Nmax(nmax)
, _x { std::vector<float>(nmax),
std::vector<float>(nmax),
std::vector<float>(nmax)
}
{
}
void setNmax(std::size_t Nmax)
{
_Nmax = Nmax;
for (auto& e : _x) {
e.resize(Nmax);
}
}
private:
std::size_t _Nmax=30000; // The parameter I want to set from outside
std::vector<std::vector<float> > _x; //the 2D vector to be initialized
};