使用lambdas初始化多维数组
initialize multidimensional array using lambdas
我想初始化一个双精度数组,该数组包含两个3D向量的三个系数中每一个系数的前4次幂。我现在正在尝试这样的东西:
auto getPows = [](double x) { return {1.,x, x*x, x*x*x, x*x*x*x};};
const double allPows[2][3][5] = {
{getPows(vec1.x()),getPows(vec1.y()),getPows(vec1.z())},
{getPows(vec2.x()),getPows(vec2.y()),getPows(vec2.z())}
};
但它给出了一个编译错误:
error: returning initializer list
我读到lambdas不能隐式返回初始值设定项列表。将lambda定义更改为:
auto getPows = [](double x) -> std::initializer_list<double> { return {...};};
没有帮助:
error: cannot convert ‘std::initializer_list<double>’ to ‘const double’ in initialization
正确的方法是什么?
我读到lambdas不能隐式返回初始值设定项列表。将lambda定义更改为[…]对没有帮助
问题是std::initializer_list
是一个(轻量级(类,而不是初始化列表。
我的意思是。。。如果您使用初始化列表来初始化一个旧的C样式数组,那么一切都很顺利
int a[] = { 1, 2, 3 }; // compile
但是如果你使用std::initializer_list
对象,你会得到一个编译错误
int b[] = std::initializer_list<int>{ 1, 2, 3 }; // compilation error
正确的方法是什么?
您标记了C++11,使用了std::intializer_list
,使用了lambda函数。。。
IMHO您应该使用std::array
s而不是旧的C样式数组来完成最后一步。
我的意思是
#include <array>
int main ()
{
auto getPows = [](double x) -> std::array<double, 5u>
{ return {{ 1., x, x*x, x*x*x, x*x*x*x }}; };
std::array<std::array<std::array<double, 5u>, 3u>, 2u>
{{ {{ getPows(1.0), getPows(2.0), getPows(3.0) }},
{{ getPows(0.1), getPows(0.2), getPows(0.3) }} }};
}
std::initializer_list
是一个视图,而不是容器
因此,永远不要试图在定义其引用序列的生存期的范围之外使用它。
接下来,std::initializer_list
是一个对象,而不是支持的init-list,后者是一个语法结构。因此,不能使用它来初始化数组、聚合的所有元素,也不能为ctor提供可变数量的参数
只是许多容器可以用std::initializer_list
中的序列初始化,而且该语言有特殊的规则使它们更方便。
只需使用支持的init列表直接提供元素即可。
相关文章:
- C++使用整数的压缩数组初始化对象
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 在 Python 和 c++ 2d 数组初始化之间.这是怎麽?为什么呢?
- 字节数组初始化会导致 DirectX 崩溃
- 使用 new 和 值进行数组初始化,但没有显式数量的元素
- 运行时C++数组初始化问题
- 使用带有参数包的数组的成员数组初始化类
- 仅通过C++中数组初始化的不同方法,即可在同一输入上获得两个不同的答案
- C++ 2 个指针数组初始化 C2440
- C++结构字符数组初始化
- C++中的多维数组初始化
- constexpr数组初始化
- C++引物动态数组初始化程序的数目超过大小
- 使用std::index_sequence对std::数组初始化进行包扩展
- 当 std 数组初始化太小时,C++会引发错误吗?
- 如何确定结构数组初始化的大小?
- Qt并发错误:数组初始化需要大括号括起来的初始值设定项列表
- 此代码中的数组初始化样式是什么?这是标准的吗?
- C++ 使用数组初始化时的 STL 向量内存管理