如何使用 STL 获取结构向量并将其转换为结构元素的向量

Posted

技术标签:

【中文标题】如何使用 STL 获取结构向量并将其转换为结构元素的向量【英文标题】:How to use the STL to take a vector of structs and turn it into a vector of the structs elements 【发布时间】:2020-04-17 20:26:17 【问题描述】:

如何使用 c++ 的算法库和迭代器库来实现相同的目标?

std::vector<float> transformVectorOfVec3ToVectorofFloats(const std::vector<vector3> & p_vec3Vector)

  std::vector<float> l_floatVector;
  l_floatVector.resize(p_vec3Vector.size());

  for(auto m_vec3 : p_vec3Vector)
  
    l_floatVector.push_back(m_vec3.x);
    l_floatVector.push_back(m_vec3.y);
    l_floatVector.push_back(m_vec3.z);
  

类似的东西

//std::transform(p_vec3Vector.begin(), p_vec3Vector.end(), l_floatVector.begin(), []()->float); ???

vector3 只是一个具有 3 个浮点成员变量的类。

【问题讨论】:

我知道有人会有更好的解决方案,但您可以使用 std::accumulate 在一行代码中返回新向量。 【参考方案1】:

您可以使用vector.insert() 和初始化列表来缩短循环:

std::vector<float> transformVectorOfVec3ToVectorofFloats(const std::vector<vector3> & p_vec3Vector)

  std::vector<float> l_floatVector;
  for(auto m_vec3 : p_vec3Vector)
      l_floatVector.insert(l_floatVector.end(), m_vec3.x,, m_vec3.y, m_vec3.z);
  return l_floatVector;

您也可以使用std::accumulate 删除所有手写循环:

std::vector<float> transformVectorOfVec3ToVectorofFloats(const std::vector<vector3> & p_vec3Vector)

    return std::accumulate(p_vec3Vector.begin(), p_vec3Vector.end(), 
                           std::vector<float>(), []
                           (std::vector<float>& total, const vector3& v) 
                            total.insert(total.end(), v.x, v.y, v.z); return total;);

【讨论】:

【参考方案2】:

std::for_each 是 std::accumulate 的替代品:

std::for_each(std::begin(p_vec3Vector), std::end(p_vec3Vector),
  [&l_floatVector](auto e) 
     l_floatVector.insert(std::end(l_floatVector), e.x, e.y, e.z);
  );

【讨论】:

非常感谢 Luis,这是非常紧凑的代码 :)

以上是关于如何使用 STL 获取结构向量并将其转换为结构元素的向量的主要内容,如果未能解决你的问题,请参考以下文章

c++ stl unordered_map 如何打印其所有值?

如何从 STL 列表中的迭代器访问指向结构的指针而不是其元素

如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?

如何在 CFFI 中找到指向结构的指针的地址并将其转换为 void**

标准模板库中的向量(vector)

MatLab数据结构