标准方式::向量<double>借用双倍[]的内容

Standard way of std::vector<double> borrowing the contents of a double[]

本文关键字:gt 向量 方式 lt double 标准      更新时间:2023-10-16

是否有一个符合标准的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的数据区域,调用函数,然后将其切换回调用方。出于性能考虑,我宁愿不复制:它是目标函数。有什么想法吗?

不,你不能那样做。

std::vector为堆上存储的内容分配空间(并拥有它),因此您不能强制它使用自己的内存。

我所说的"使用你自己的内存"是指"你自己的内存,其中包含有效的内容,除非你明确说明,否则它被保留下来,永远不会被容器触及"。当然,您可以通过覆盖"分配器"参数来定义自己的内存分配策略,但在这种情况下这不是解决方案。

更改函数以接受模板化的开始和结束迭代器

而不是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;
}

如果要临时存储到向量中的double[]没有特定的分配约束,则可以使用第二个std::vector<double>并使用std::swap(vec1, vec2)进行快速元素交换。然后要从任何向量中获得double[],只需执行&vec[0] .

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