Замена старых массивов в стиле C современными структурами данных C ++ STL - PullRequest
1 голос
/ 25 октября 2019

Я реализовал простой класс для симуляции n-body в C ++. Однако в классе используется множество старых массивов в стиле 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 частицы? Мой текущий подход не работает, и компилятор выдает много ошибок. Как мне сделать это правильно?

Ответы [ 3 ]

6 голосов
/ 25 октября 2019

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 либо в качестве перечислителя структуры, либо в качестве статического члена данных структуры /

2 голосов
/ 25 октября 2019

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; 
};
0 голосов
/ 25 октября 2019

Чтобы изменить размер вектора, вы можете использовать:

p.resize(n);

Все новые элементы будут созданы по умолчанию, что в данном случае означает, что они будут содержать значения мусора.

...