我正在尝试让下面的代码正常工作
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++方法是使用
使用原生C数组会使您陷入与分配相关的问题,这是您应该避免的。您看到的编译器警告不可轻视(就像任何警告一样)。它告诉您 除此之外,请参阅以下有用的答案:如何在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