我有一个算法,它需要一个std::vector
(调用它A
)。但是,我已经有了B
条目N + 2
,我基本上想要的是通过B.data() + 2
,所以算法N
从B
. 如果A
被修改,那么也是B
。
当使用double*
指针时,我应该如何制作它是非常清楚的,但是这也可以用std::vector
s 吗?我的意思是,向量的好处是它为我处理内存,而我现在想要的是禁止它(如果B
或被A
破坏,它们应该保持指向的数据不变)。
像这样:
std::vector< double > B({1,2,3,4,5});
std::vector< double > A(B.data() + 2, B.size() - 2);
// A and B share data now. A is 3, 4, 5
我知道通过采用一对迭代器可以更好地为此目的设计算法,但这不在我手中。
更新
(在评论中,希望看到签名,这里是)
nlopt::result nlopt::opt::optimize(std::vector<double> &x, double &opt_f);
但是,我的初衷是非常聪明,让算法直接优化我的 vector B
,所以我最终得到的是这样的:
std::vector< double > B(N + 2);
// do something with it here, like put initial values
std::vector< double > A( B.begin() + 2, B.end() );
optimize( A );
std::copy(A.begin(), A.end(), B.begin() + 2);
我真的不担心这种解决方法,我还在文档中读到,nlopt
如果使用 C++ 接口而不是 C 接口,则向量在内部无论如何都是复制的。
但同样,这个例子确实让我对算法界面设计大开眼界,值得花一些时间浏览诸如 boost 库之类range
的东西。