【问题标题】:How to use the STL to take a vector of structs and turn it into a vector of the structs elements如何使用 STL 获取结构向量并将其转换为结构元素的向量
【发布时间】: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 在一行代码中返回新向量。

标签: c++ algorithm stl


【解决方案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,这是非常紧凑的代码 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-30
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-05
    相关资源
    最近更新 更多