用现代 C++ STL 数据结构替换旧的 C 风格数组

Replacing old C style arrays with modern C++ STL data structures

我用 C++ 实现了一个简单的 class 多体模拟。但是,class 使用了很多我想用 STL 提供的数据结构替换的旧 C 样式数组。

这是我想要改进的代码的相关部分:

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];
}

我尝试使用 std::vector<Particle>。但是在这种情况下我该如何正确初始化 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 个值初始化元素的向量。

同样在结构 Particle 的定义中,您可以将数组替换为 std::array<double, DIM> 类型的对象。此外,最好将常量 DIM 作为结构的枚举数或作为结构的静态数据成员/

要更改向量的大小,您可以使用:

p.resize(n);

所有新元素都将默认构造,在本例中这意味着它们将包含垃圾值。

new std::vector<Particle> [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()代替。

应将粒子本身的初始化添加到 Particle

struct Particle{
    double mass = 0.0;
    double position[DIM] = {};
    double velocity[DIM] = {};
    double force[DIM] = {}; 
};

struct Particle{
    double mass = 0.0;
    std::array<double, DIM> position;
    std::array<double, DIM> velocity;
    std::array<double, DIM> force; 
};