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

问题描述 投票:0回答:2

我如何使用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个float成员变量的类。

c++ algorithm stl
2个回答
0
投票

您可以使用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;});
}

0
投票

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});
  });
© www.soinside.com 2019 - 2024. All rights reserved.