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

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

本文关键字:风格 数组 替换 C++STL 数据结构      更新时间:2023-10-16

我在C++中实现了一个用于n-body模拟的简单类。然而,该类使用了许多旧的C风格数组,我想用STL提供的数据结构来替换这些数组。

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

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不是指针。CCD_ 4被声明为向量。

像一样重写构造函数定义

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作为结构的枚举器或作为结构/的静态数据成员

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

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

p.resize(n);

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