C++:std :: vector - 可以"切片"一个向量吗?

use*_*501 6 c++ vector slice c++11 array-view

我正在编写一些代码来集成ODE.这个问题同样是对解决方案的编码建议的要求,所以如果您对我即将提供的建议有其他建议,请告诉我!

由ODE集成商集成的"对象"以6个"块"为单位......原因是我有一个std :: vector of double,它们按以下方式排列:

前3个双打是位置坐标; x,y和z.接下来的3个双打是速度坐标; x,y和z.

那么,现在你知道了,我有一个函数,它将成对的"位置" """向量"""作为参数并返回某种结果......看看我要去哪里?

目前,该函数需要以下列方式使用2个位置坐标:

std::vector<double> magic_gravity_formula(const std::vector<double> &r1,
          const std::vector<double> &r2, const double m1, const double m2)
Run Code Online (Sandbox Code Playgroud)

我不想将3组中的所有数据复制到新的向量 - 这是一种疯狂(并且非常慢)的编程方式.

可以使用指向原始数据的指针......并且只是将指针传递给x坐标(3个双打块中的第一个项目) - 这对我来说似乎没有问题,但也许有更好的方法?有点像Python或Matlab数组切片?我可以这样做吗?

我想传递一个新的向量(或某种包装类?),从已存储在数组中的数据创建...有点像

std::vector<double> sub_section_of_data = data[0..2] // Obviously pseudocode!
Run Code Online (Sandbox Code Playgroud)

好的,所以上面的内容是荒谬的,因为大概是一种实现该语法的语言仍然可以进行复制操作,这可能很慢 - 正是我想要避免的...

所以,是的,我不确定这里最好的方式 - 有人能建议一个"好"的解决方案吗?(以非主观的方式!)

编辑:为了使这一点非常清楚 - 问题是我不想做类似的事情:

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);
Run Code Online (Sandbox Code Playgroud)

编辑2:考虑编译器选项 - 编译器是否会通过以下方式更改函数以接受参数来为我优化我的代码:

std::vector<double> super_gravity_formula(double x1, double y1, double z1, double x2, double y2, double z2, double m1, double m2)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,也许这个问题并不重要?(除了形成"使你的代码看起来很好看"的观点.)

编辑3:因此它仍然很重要.

Yak*_*ont 6

您想要查看现有的矢量.

std::experimental::array_view<T>,或自己动手.

数组视图是一对T*和访问器,可以让它像数组一样对待它operator[] .begin() .back() size() empty().

这是我推出的许多此类实现之一.那个有点重,有一个range<Iterator>自适应处理随机访问迭代器的视图,以及一个array_view<T>继承自的range<T*>.

如果它不起作用,请在"yakk"上用"array_view"搜索SO上的其他帖子,或者自己调试.我已经写了至少六次,或多或少的调试,具有不同的const正确性规则.

一旦你拥有它,{ vec.data()+index, vec.data()+index+3 }将构建一个array_view<double>接近零开销.