是否存在符合C ++(最好是C ++ 11)标准的习惯用法,我可以使用它来std::vector<double>
借用已知double[]
的内容大小
我有一个函数(实际上是伪装成来自优化器的回调函数)和原型:
double MyFunctorClass::operator()(double s[]) const;
(MyFunctorClass
也有m_size
,显示s
的元素数量。
我想调用一个以const std::vector<double>&
作为输入的函数。
一种解决方案技术涉及我创建std::vector<double>
成员变量并以某种方式将double[]
数据切换到std::vector
的数据区域,调用该函数,然后将其切换回调用者。由于性能问题,我宁愿不复制:它是目标函数。有什么想法吗?
答案 0 :(得分:7)
不,你做不到。
std::vector
为堆上的存储内容分配空间(并拥有它),因此您无法强制它使用自己的内存。
通过“使用你自己的记忆”,我的意思是“你自己的记忆中有有效的内容,除非你明确地这样说,否则它将被保留并且永远不会被容器触及”。当然,您可以通过覆盖'allocator'参数来定义自己的内存分配策略,但在这种情况下,这不是解决方案。
答案 1 :(得分:4)
将您的函数更改为接受模板化的开始和结束迭代器
而不是void foo( std::vector<double> vd )
使用template<typename Iter> void foo( Iter begin, Iter end )
这将允许您传入任何标准容器或指针。
迭代如下:
while( begin!=end ) {
/*const?*/ double& value = *begin;
// whatever you were going to do
++begin;
}
答案 2 :(得分:0)
如果要临时存储到向量中的double[]
没有特定的分配限制,则可以使用第二个std::vector<double>
并使用std::swap(vec1, vec2)
进行快速元素交换。然后从任何向量中获取double[]
只需&vec[0]
。
请注意,我认为交换不能保证保留内部数组的地址(尽管我不能想到任何没有的实现)。 编辑:它实际上是有保证的(见评论)。