在向量大括号初始化中将 C 数组传递给结构初始化程序

Posted

技术标签:

【中文标题】在向量大括号初始化中将 C 数组传递给结构初始化程序【英文标题】:Passing a C array to a struct initializer in a vector brace initialization 【发布时间】:2016-01-30 14:34:55 【问题描述】:

首先,我见过this question。

我很好奇为什么以下方法不起作用:

float vcolor[4]color.getX(),color.getY(),color.getZ(),1.0f;
float v1[3]from.getX(),from.getY(),from.getZ();
float v2[3]to.getX(),to.getY(),to.getZ();
std::vector<Vertex> v=v1,vcolor,v2,vcolor;

没有匹配的构造函数用于初始化 'std::vector'

但是直接传递元素可以正常工作(如另一个问题中所述):

std::vector<Vertex> v=
    from.getX(),from.getY(),from.getZ(),
        color.getX(),color.getY(),color.getZ(),1.0f,
    to.getX(),to.getY(),to.getZ(),
        color.getX(),color.getY(),color.getZ(),1.0f;

不应该是前者也可以吗?

【问题讨论】:

v1,vcolor,v2,vcolor 没有形成初始化列表。 @Lingxi 谢谢但是.. 它们在另一对大括号内,这将是一个初始化列表,不是吗? 刚刚看了Vertex的定义。问题是你不能复制初始化数组。 【参考方案1】:

这里是一个简单的解释。您可以使用聚合初始化语法将数组初始化为float arr[4] = 1.f, 2.f, 3.f, 4.f 。这就是Vertex v = 1.f, 2.f, 3.f, 1.f, 2.f, 3.f, 4.f 起作用的原因。你不能做的是从另一个数组复制初始化一个数组。所以

float arr[4] =  1.f, 2.f, 3.f, 4.f ;
float brr[4] = arr;

不起作用。因此,最终,在您的问题中,第一种形式不起作用。

【讨论】:

arr[4] 无论如何都不会命名第一个数组。它命名该数组的最后一个元素。你的最后一个例子应该是float brr[4] = arr; @LightnessRacesinOrbit 我的错。感谢您的善意提及:-)【参考方案2】:

让我们更详细地看看你在这里尝试做什么:

std::vector<Vertex> v=
    from.getX(),from.getY(),from.getZ(),
        color.getX(),color.getY(),color.getZ(),1.0f,
    to.getX(),to.getY(),to.getZ(),
        color.getX(),color.getY(),color.getZ(),1.0f;

你尝试用两个元素初始化一个 Vector,这两个元素是用

初始化的
from.getX(),from.getY(),from.getZ(),
    color.getX(),color.getY(),color.getZ(),1.0f

to.getX(),to.getY(),to.getZ(),
    color.getX(),color.getY(),color.getZ(),1.0f

这些也是初始化列表,C++ 试图将其转换为顶点。 Sinze 它们包含两个元素,它们本身是包含 3(4) 个浮点数的初始化列表。 (至少我假设你的getX/Y/Z() 返回浮点数),一切都很好,它们用于初始化每个顶点内的数组。这有点等价于调用

Vertexfrom.getX(),from.getY(),from.getZ(),
        color.getX(),color.getY(),color.getZ(),1.0f;

float position[3]from.getX(),from.getY(),from.getZ();
float color[4]color.getX(),color.getY(),color.getZ(),1.0f;

现在让我们看看你的第二个案例:

std::vector<Vertex> v=v1,vcolor,v2,vcolor;

同样,每个包含初始化器列表都“映射”到一个顶点,调用如下:

Vertexv1,vcolor

但是 v1 和 vcolor 不是初始化列表,它们只是一个指向浮点的指针 (float*)

就像你做不到一样

float v3[3]v1;

或更明显

float* f = new float;
float v[3]f;

无法从float* 初始化数组

您可以尝试改用 std::arrays 并使用其基于迭代器的构造。或者您可以尝试为您的 Vertex 编写适当的构造函数。或者您可以将初始值设定项列表存储为初始值设定项列表,直到您实际形成顶点。无论哪种方式,通过多个步骤构建您的 Vertex 将需要更多的工作。

【讨论】:

如果他的Vertex 有一个基于范围的构造函数,他可以为每个顶点使用std::begin(vX), std::end(vX), std::begin(vcolor), std::end(vcolor),即使是C 样式的数组。

以上是关于在向量大括号初始化中将 C 数组传递给结构初始化程序的主要内容,如果未能解决你的问题,请参考以下文章

大括号封闭初始化列表?转换为矢量

数组必须用大括号括起来的初始化程序 c++ 初始化

在 C 中将多维数组作为参数传递

无法从构造函数中将数组值传递给向量

C语言,结构体中的数组怎么赋值,?

如何在不使用向量的情况下将数组传递给函数?