从类型为float的std::vector<glm::vec3>获取数组指针

4

我有一个std::vector<glm::vec3>,我想获取一个浮点类型的数组指针。

如果std::vector的内容如下:

std::vector[0] = vec3(0.1f, 0.2f, 0.3f)
std::vector[1] = vec3(0.4f, 0.5f, 0.6f)
std::vector[2] = vec3(0.7f, 0.8f, 0.9f)

如果指定当前索引,则数组指针将返回以下内容:

array[0] = 0.1f
array[1] = 0.2f
array[2] = 0.3f
array[3] = 0.4f
array[4] = 0.5f
array[5] = 0.6f
array[6] = 0.7f
array[7] = 0.8f
array[8] = 0.9f

如果有可能,最常见的实现方式是什么?

从这三个vector创建一个新的vector - Maroun
1
float * ptr = &vec[0]; - Jaa-c
制作一个简单的包装器,为您执行数组算术运算......此外,您的代码是错误的,您不能执行std::vector[0]。 - NoSenseEtAl
@Jaa-c,您是在建议为向量中的每个浮点数创建一个浮点指针数组吗? - Qualphey
@NoSenseEtAl 你可以给我更多关于那个的信息。那不是代码,那只是我展示给你向量内容的方式。 - Qualphey
显示剩余2条评论
2个回答

4
std::vector<glm::vec3> vec;
vec.push_back(glm::vec3(0.1f, 0.2f, 0.3f));
vec.push_back(glm::vec3(0.3f, 0.4f, 0.5f));
vec.push_back(glm::vec3(0.7f, 0.8f, 0.9f));

float *flat_array = &vec[0].x;

for(int i=0; i<9; i++)
    std::cout << flat_array[i] << std::endl;

假设glm::vec3包含三个紧密打包的浮点数,您可以获取指向第一个vec的第一个元素的指针。该指针可以像数组一样进行索引。

请注意,如果glm::vec3包含双精度或其他成员变量,则指针操作可能失败。


glm::vec3 只包含浮点数,所以它可以工作。同时 vec[0].xvec[0][0] 都可以工作。 - Jaa-c
1
你可以使用静态断言来验证 (sizeof vec3) == 3 * sizeof(float)。 - NoSenseEtAl
@NoSenseEtAl 没错,那很有道理。但是我没有编译器来测试这个例子 :) - MB-F
另外,还可以查看glm的扩展glm/gtc/type_ptr.hpp,它“处理指针和向量、矩阵类型之间的交互”(巧合的是,它确认了&vec.x的使用)。 - humbletim

2
正如上面评论中humbletim指出的那样,我会使用在glm/gtc/type_ptr.hpp中定义的glm::value_ptr。
std::vector<glm::vec3> vec;
vec.push_back(glm::vec3(0.1f, 0.2f, 0.3f));
vec.push_back(glm::vec3(0.3f, 0.4f, 0.5f));
vec.push_back(glm::vec3(0.7f, 0.8f, 0.9f));

float* flat_array = static_cast<float*>(glm::value_ptr(vec.front()));
std::cout << std::endl;
for (int i = 0; i < vec.size()*(vec.front().length()); ++i ) {
    std::cout << flat_array[i] << std::endl;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接