San*_*dro 1 c++ arrays pointers stdvector
我目前使用 std::vector 来存储一些数据(注意:大小在构造时已知,之后不会更改:如果您看到比向量更好的结构,这对我来说很好)。稍后在程序中,我需要将部分数据(前 N 个值)传递给优化函数,该函数将就地修改它。
一个简单的解决方案是传递对整个向量的引用以及用于优化的部分的索引。但是,如果我可以避免告诉优化函数(及其子函数)要优化哪一部分,而只给它们一个仅包含要优化的值的向量/数组/you_name_it,那就太好了。
所以基本上,我想要两个“数组”之类的对象(都是恒定大小,但大小仅在运行时知道)共享相同的内存。
例如,如果 std::vector 的成员是公共的,一个简单的解决方案是
std::vector<int> original_vector={0,1,2,3,4,5,6,7,8}
std::vector<int> sub_vector(0);
sub_vector.data=original_vector->data; //point to the same data (nb : there is no public data member, just a data() getter, and as far as I know no setter)
sub_vector.length=3;
//sub_vector now appears to contain {0,1,2}
sub_vector[1]=42;
//oringinal_vector now contains {0,42,2,3,4,5,6,7,8}
Run Code Online (Sandbox Code Playgroud)
另一种解决方案是获取数据指针,然后将原始 C 风格指针 + 长度传递给优化函数。但在 C++ 中为数组提供 C 指针并不好。如果有一个 std 容器可以通过 C 指针 + 长度初始化(无需复制),这可能是一个很好的解决方案。
还有其他想法吗?
注意:我还没有编写优化代码,所以如果更容易的话,我也可以将所有要优化的数据放在最后而不是开头。
注意:如果有一种不复制数据的方法,也可以先创建 2 个“子数组”(固定数据和要优化的数据),然后创建全局数组
编辑:目前,我仅限于 C++17,因为 ROS2 还不支持 C+20
你在找吗std::span?
std::vector<int> original_vector={0,1,2,3,4,5,6,7,8};
std::span<int> sub_vector(original_vector.begin(), 3);
Run Code Online (Sandbox Code Playgroud)