【发布时间】:2013-11-01 09:52:48
【问题描述】:
我有一个算法需要std::vector(称之为A)。但是,我已经有了B 和N + 2entries,我基本上想要传递B.data() + 2,所以算法从B 获取最后一个N 条目。如果A被修改,那么B也是如此。
当使用double* 指针时,我应该如何做到这一点非常清楚,但是std::vectors 也可以做到这一点吗?我的意思是,向量的好处是它可以为我处理内存,而我现在想要的是禁止它(如果 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
我知道通过使用一对迭代器可以更好地为此目的设计算法,但这不在我的手中。
更新
(在cmets中,想看签名,就在这里)
nlopt::result nlopt::opt::optimize(std::vector<double> &x, double &opt_f);
但是,我的初衷是要非常聪明,让算法优化我的向量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 接口,向量无论如何都会在内部多次复制。
但是,这个例子确实让我对算法界面设计大开眼界,值得花一些时间浏览例如range 等 boost 库。
【问题讨论】:
-
@timrau 这无济于事,因为 OP 的算法需要
std::vector,而不是double *。 -
"(如果 B 或 A 被破坏,它们应该保持指向的数据不变)"?恕我直言,如果
A被破坏,B应该保留,但如果B被破坏,访问A中的任何值应该是未定义的行为。回答您的“可能”问题:是的,是的。 -
它期望
vector按值还是按引用?因为如果它需要一个值,你可能只是复制它。 -
是的,你的行为对我来说没问题,因为我保证两个向量一直都在那里,但作为一个 STL 设计师我不会实现这样不安全的代码,这就是为什么我认为我的用例是有效的,但没有很好的通用解决方案。
-
使用 Boost.Range 的
boost::adaptors::slice:algo(boost::adaptors::slice(B, 2, B.size()-2));