标准方式std :: vector <double>借用double [] </double>的内容

时间:2013-12-17 14:38:05

标签: c++ c++11 vector stl

是否存在符合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的数据区域,调用该函数,然后将其切换回调用者。由于性能问题,我宁愿不复制:它是目标函数。有什么想法吗?

3 个答案:

答案 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]

请注意,我认为交换不能保证保留内部数组的地址(尽管我不能想到任何没有的实现)。 编辑:它实际上是有保证的(见评论)。