用现代 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;
};
我用 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;
};