我正在尝试将 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 << " ";