如何将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来创建数组,因为我想避免堆分配。

处理此类数组的现代C++方法是使用std::array。这样可以避免你面临的问题。

像您这样使用本机C数组会使您陷入与分配相关的问题,而这些问题应该避免。您看到的编译器警告不能掉以轻心(就像任何警告一样(。它告诉您foo指向的内存超出了lambda的范围。它很可能被您在调用createMyArray()之后创建的myVector对象覆盖,对foo元素的任何进一步引用都可能给您带来垃圾。

除此之外,这里还有一些有用的答案:如何在不循环的情况下将数组的内容复制到C++中的std::vector?

退出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

您可以使用std::back_inserter将元素复制到末尾附加的向量中

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

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

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

最新更新