用现代C++STL数据结构替换旧的C风格数组
Replacing old C style arrays with modern C++ STL data structures
我在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);
所有新元素都将默认构造,这意味着它们将包含垃圾值。
相关文章:
- 用现代C++STL数据结构替换旧的C风格数组
- 使用模板返回通用的C风格数组
- C .何时删除C风格数组以自由存储器
- constexpr返回多维C风格数组的尺寸元组
- 是否有一种替换C风格的Bool数组的标准方法
- 如何通过Boost::MPI发送2d C风格的数组
- 使用PINVOKE编组LPWSTR的C风格数组,以托管字符串[]
- matlab风格的C++数组索引
- 如何从C++中最好地调用具有C99风格数组函数签名的函数
- 如何从C风格的constchar*数组中提取整数
- C++中Fortran风格的多维数组
- Java中数组的创建(C++风格)
- 使用c风格数组作为STL字符串操作的后端
- 删除c风格的int向量数组
- 将任何容器转换为c风格的数组视图
- 带有std::array的可变进模板结构体与c风格数组成员的区别
- Std::数组优于c风格数组
- 如何廉价地将c风格数组赋值给std::vector
- 如何用std::distance对c风格数组类型使用std::copy输出
- 使用Ifstream将数字从文本文件添加到C风格数组