【问题标题】:Getting an array pointer from std::vector<glm::vec3> with the type of float从 std::vector<glm::vec3> 获取浮点类型的数组指针
【发布时间】:2014-03-19 14:49:51
【问题描述】:

我有一个std::vector&lt;glm::vec3&gt;,我想从中获取一个浮点类型的数组指针。

如果 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

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

【问题讨论】:

  • 从这 3 个vectors 中创建一个新的vector
  • 但我不想要数据副本
  • float * ptr = &amp;vec[0]; ?
  • 制作一个简单的包装器,为你做数组运算......你的代码也错了,你不能做 std::vector[0]
  • @Jaa-c 你是在建议一个指向向量向量中每个浮点数的浮点指针数组吗?

标签: c++ arrays pointers c++11 vector


【解决方案1】:
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] 也可以同时使用。
  • kazemakse 你可以静态断言 (sizeof vec3) == 3* sizeof (float)
  • @NoSenseEtAl 是的,这是有道理的。但是,我没有编译器来测试这个例子:)
  • 另见glm的extensionglm/gtc/type_ptr.hpp“处理指针与向量、矩阵类型之间的交互”(巧合地证实了&vec.x的使用)。
【解决方案2】:

正如上面评论中的谦虚提姆所指出的,我会使用 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-02
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2022-12-19
    • 2011-09-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多