0

我正在尝试将 STLstd::valarray合并到我的程序中。我希望能够从这样的东西改变我的程序的一部分

for (unsigned int d = 0; d < DIM; ++d) {
    position[d] += dt*(velocity[d] + a*force_new[d]);
    force_old[d] = force_new[d];
}

对此

    position += dt*(velocity + a*force_new);
    force_old = force_new;

for (const auto& particle: particles) {
    for (unsigned int d = 0; d < DIM; ++d) {
        std::cout << particle.position[d] << " ";
    }
    std::cout << std::endl;
}

类似于

for (const auto& particle: particles) {
    for(const auto& item: particle.position) std::cout << item << " ";
    std::cout << std::endl;
}

目前,我使用的数据结构如下:

struct Particle{
    std::array<double, DIM> position; 
    std::array<double, DIM> velocity;
    std::array<double, DIM> force_new;
    std::array<double, DIM> force_old;
    void update_position();
};

我将这部分代码更改为

struct Particle{           
    std::array<std::valarray<double>, DIM> position; 
    std::array<std::valarray<double>, DIM> velocity;
    std::array<std::valarray<double>, DIM> force_new;
    std::array<std::valarray<double>, DIM> force_old;
    void update_position();
};

但是,如果我如上所示更改我的代码,我的代码不会编译。编译器会抛出错误,例如

nbody.cpp: In member function ‘void Particle::update_position(double)’:
nbody.cpp:83:33: error: no match for ‘operator*’ (operand types are
‘const double’ and ‘std::array<std::valarray<double>, 2>’)
position += dt*(velocity + a*force_new);

    nbody.cpp: In member function ‘void Nbody::print_data() const’:
    nbody.cpp:45:60: error: no match for ‘operator<<’ (operand types are
    ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘const
    std::valarray<double>’) for(const auto& item: particle.position)
std::cout << item << " ";
4

0 回答 0