用现代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你在哪里看到混合风格?