提问者:小点点

如何将lambda返回的浮点数组插入到浮点数向量中?


我正在尝试让下面的代码正常工作

auto createMyArray = []() {
  float foo[] = {0.0f, 1.5f, 2.0f};
  return foo;
};

auto myArray = createMyArray();

std::vector<float> myVector;

// fatal error: no matching function for call to 'begin'
myVector.insert(myVector.end(), std::begin(myArray), std::end(myArray));

问题是createMyArray返回一个指向数组的指针,我不确定尝试取消引用它是否是个好主意。

我还收到以下警告

warning: address of stack memory associated with local variable 'foo' returned [-Wreturn-stack-address]
    return foo;

这是有意义的,因为我没有使用new来创建数组,因为我想避免堆分配。


共3个答案

匿名用户

处理此类数组的现代C++方法是使用。那应该可以避免你面临的问题。

使用原生C数组会使您陷入与分配相关的问题,这是您应该避免的。您看到的编译器警告不可轻视(就像任何警告一样)。它告诉您指向Lambda范围之外的内存。它很可能被您在调用之后创建的对象覆盖,并且任何对

除此之外,请参阅以下有用的答案:如何在C++中将数组的内容复制到std::vector中而不循环?

匿名用户

您可以使用将元素复制到在末尾追加的向量中

std::copy(myArray, myArray + 3, std::back_inserter(myVector));

myVector.insert(myVector.end(), myArray, myArray + 3);

顺便说一下,在lamba函数中创建的数组是堆栈分配的,这意味着在lamba函数执行后数组将不再存在,而是使用动态内存分配

匿名用户

退出lambda表达式后,本地数组将不是活动的。因此代码具有未定义的行为。

但是不需要使用lambda在向量中插入初始值列表。

这里有一个演示程序。

#include <iostream>
#include <vector>
#include <iterator>

int main() 
{
    std::vector<float> myVector;
    
    myVector.insert( std::end( myVector ), {0.0f, 1.5f, 2.0f} );
    
    for ( const auto &item : myVector ) std::cout << item << ' ';
    std::cout << '\n';
    
    return 0;
}

程序输出为

0 1.5 2