用现代C+替换旧的C样式阵列+;STL数据结构 我在C++中实现了一个简单的N体仿真类。然而,这个类使用了很多旧的C风格的数组,我想用STL提供的数据结构来替换它们
以下是我希望改进的代码的相关部分:用现代C+替换旧的C样式阵列+;STL数据结构 我在C++中实现了一个简单的N体仿真类。然而,这个类使用了很多旧的C风格的数组,我想用STL提供的数据结构来替换它们,c++,vector,initialization,stdarray,construct,C++,Vector,Initialization,Stdarray,Construct,以下是我希望改进的代码的相关部分: struct Particle{ double m; // mass double x[DIM]; // position double v[DIM]; // velocity double F[DIM]; // force }; class Nbody { private: const unsigned int n; // num
struct Particle{
double m; // mass
double x[DIM]; // position
double v[DIM]; // velocity
double F[DIM]; // force
};
class Nbody {
private:
const unsigned int n; // number of particles
const double dt; // step size
const double t_max; // max simulation time
std::vector<Particle> p;
public:
~Nbody(){};
Nbody(unsigned int n_, double dt_, double t_max_);
};
Nbody::Nbody(unsigned int n_, double dt_, double t_max_)
: n{n_}, dt{dt_}, t_max{t_max_} {
p = new std::vector<Particle> [n];
}
struct粒子{
双m;//质量
双x[DIM];//位置
双v[DIM];//速度
双F[DIM];//力
};
B类车身{
私人:
常量unsigned int n;//粒子数
const double dt;//步长
const double t_max;//最大模拟时间
std::向量p;
公众:
~Nbody(){};
Nbody(无符号整数n,双dt,双t最大值);
};
Nbody::Nbody(无符号整数n,双dt,双t最大值)
:n{n},dt{dt},t_max{t_max}{
p=新标准::向量[n];
}
我尝试使用
std::vector
。但在这种情况下,如何正确初始化n
粒子?我当前的方法不起作用,编译器会抛出许多错误。如何正确操作?p
不是指针p
被声明为向量
重写构造函数定义,如
Nbody::Nbody(unsigned int n_, double dt_, double t_max_)
: n{n_}, dt{dt_}, t_max{t_max_}, p( n_ ) {
}
在这种情况下,向量p
被初始化为具有n个值初始化元素的向量
此外,在结构
粒子
的定义中,可以将数组替换为std::array
类型的对象。另外,最好将常量设置为DIM
作为结构的枚举器或结构的静态数据成员p
不是指针p
被声明为向量
重写构造函数定义,如
Nbody::Nbody(unsigned int n_, double dt_, double t_max_)
: n{n_}, dt{dt_}, t_max{t_max_}, p( n_ ) {
}
在这种情况下,向量p
被初始化为具有n个值初始化元素的向量
此外,在结构
粒子
的定义中,可以将数组替换为std::array
类型的对象。另外,最好将常量设置为DIM
作为结构的枚举器或结构的静态数据成员要更改向量的大小,可以使用:
p.resize(n);
所有新元素都将默认构造,这意味着它们将包含垃圾值。要更改向量的大小,可以使用:
p.resize(n);
所有新元素都将默认构造,这意味着它们将包含垃圾值。new std::vector[n]
动态分配一个n
空向量数组,并生成指向第一个向量的指针。这与包含
n
元素的向量不同
您应该使用初始化器列表:
Nbody::Nbody(unsigned int n_, double dt_, double t_max_)
: n{n_}, dt{dt_}, t_max{t_max_}, p{n_}
{
// Empty.
}
假设n
跟踪粒子的数量,您可以将其去掉,改用p.size()
粒子本身的初始化应添加到粒子
struct Particle{
double mass = 0.0;
double position[DIM] = {};
double velocity[DIM] = {};
double force[DIM] = {};
};
或
struct粒子{
双质量=0.0;
std::阵列位置;
阵列速度;
阵列力;
};
new std::vector[n]
动态分配一个n
空向量数组,并生成指向第一个空向量的指针。这与包含
n
元素的向量不同
您应该使用初始化器列表:
Nbody::Nbody(unsigned int n_, double dt_, double t_max_)
: n{n_}, dt{dt_}, t_max{t_max_}, p{n_}
{
// Empty.
}
假设n
跟踪粒子的数量,您可以将其去掉,改用p.size()
粒子本身的初始化应添加到粒子
struct Particle{
double mass = 0.0;
double position[DIM] = {};
double velocity[DIM] = {};
double force[DIM] = {};
};
或
struct粒子{
双质量=0.0;
std::阵列位置;
阵列速度;
阵列力;
};
旧的C风格数组是什么样子的?你试过了吗::n{n},dt{dt},t{t{u max},p{n}{
?@JohnGo-Soco我用了粒子*p=新粒子[n]同样的原因,你应该考虑在<代码>粒子>代码中替换数组,用<代码> STD::数组< /代码> @ Jang-SoCo,我猜它像X,Y,Z;Vx,y,Vz;Fx,Fy,Fz……每个粒子在空间中的表示,它拥有的瞬时速度向量和力VE。ctor应用于它旧的C风格数组是什么样子的?你试过了吗?@JohnGo-Soco我用了Particle*p=newparticle[n]同样的原因,你应该考虑在<代码>粒子>代码中替换数组,用<代码> STD::数组< /代码> @ Jang-SoCo,我猜它像X,Y,Z;Vx,y,Vz;Fx,Fy,Fz……每个粒子在空间中的表示,它拥有的瞬时速度向量和力VE。ctor应用于itThanks!你为什么要将质量设置为零?为了防止bug?@Samuel一个好的经验法则是总是初始化所有东西,并且零似乎是一个合理的默认质量。如果对你更有意义,请使用其他一些值。只是不要让它处于未初始化状态。使用{}
用零初始化粒子?@Samuel是的,是的。谢谢!你为什么要将质量设置为零?为了防止错误?@Samuel一个好的经验法则是总是初始化所有东西,而零似乎是一个合理的默认质量。如果你觉得更有意义,请使用其他值。只是不要让它未初始化。使用{
用零初始化粒子?@Samuel是的,确实如此。我很高兴你回到了经典初始化(p(n)
),但在我看来,混合式的初始化甚至比(破碎的)统一初始化更糟糕…@Aconcagua你在哪里看到混合式的?我很高兴你回到了经典初始化(p(n)
),但在我看来,混合风格甚至比(破损的)统一初始化更糟糕…@Aconcagua你在哪里看到混合风格?