我正在编写一些代码来集成 ODE。这个问题既是对编码建议的请求,也是对解决方案的请求,因此如果您对我即将提供的建议有其他建议,请告诉我!
要由 ODE 积分器积分的“对象”以 6 个“ block ”的形式出现...这样做的原因是我有一个 double 的 std::vector,它们按以下方式排列:
前3个double是位置坐标; x、y 和 z。 接下来的 3 个 double 坐标是速度坐标; x、y 和 z。
所以,现在你知道了,我有一个函数,它接受成对的“位置”“”“vector ”“” 作为参数并返回某种结果......看看我在哪里我要接受这个吗?
目前函数需要 2 批位置坐标,方式如下:
std::vector<double> magic_gravity_formula(const std::vector<double> &r1,
const std::vector<double> &r2, const double m1, const double m2)
我不想将 3 组中的所有数据复制到新 vector 中 - 这是一种疯狂(而且非常慢)的编程方式。
我可以改为使用指向原始数据的指针...并只传递一个指向 x 坐标的指针(3 个 double block 中的第一个项目)- 这对我来说似乎没问题,但是也许有更好的方法?有点像 Python 或 Matlab 数组切片?我可以做这样的事情吗?
我有点想传递一个新的 vector (或某种包装类?),它是根据已经存储在数组中的数据创建的……有点像
std::vector<double> sub_section_of_data = data[0..2] // Obviously pseudocode!
好吧,以上是荒谬的,因为大概实现了该语法的语言仍然会进行复制操作,这可能很慢——这正是我试图避免的......
所以是的,我不确定在此处进行的最佳方式 - 谁能提出一个“好的”解决方案? (以非主观的方式!)
编辑:要说清楚 - 问题是我不想做类似的事情:
std::vector<double> r1_temp;
r1_temp.push_back(data[0]); // Copy ! Bad !
r1_temp.push_back(data[1]);
r1_temp.push_back(data[2]);
... same for an r2 ...
std::vector<double> force = magic_gravity_formula(r1, r2, m1, m2);
编辑 2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:
std::vector<double> super_gravity_formula(double x1, double y1, double z1, double x2, double y2, double z2, double m1, double m2)
在那种情况下,也许这个问题不重要? (除了形成“让你的代码看起来好读”的观点。)
编辑 3:因此它仍然很重要。
最佳答案
您想查看现有 vector 。
std::experimental::array_view<T>
,或推出您自己的。
数组 View 是一对T*
,以及让您将其视为数组的访问器 operator[]
.begin()
.back()
size()
empty()
等等
Here is one of many such implementations I've rolled .那个有点重,带有range<Iterator>
自适应处理随机访问迭代器的 View ,以及 array_view<T>
继承自 range<T*>
.
如果还不行,搜索“yakk”的SO上的另一个帖子“array_view”或者自己调试。我至少写了六次,或多或少调试,使用不同的 const
正确性规则。
一旦你拥有它,{ vec.data()+index, vec.data()+index+3 }
将构建一个 array_view<double>
开销几乎为零。
关于C++: std::vector - "slice"一个 vector 是可能的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30717947/