Как использовать STL, чтобы взять вектор структур и превратить его в вектор элементов структур - PullRequest
0 голосов
/ 17 апреля 2020

Как я могу использовать библиотеки алгоритмов и итераторов 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 переменными-членами с плавающей точкой.

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

std :: for_each является альтернативой std :: накоплению:

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});
  });
0 голосов
/ 17 апреля 2020

Вы можете использовать vector.insert() и список инициализаторов для сокращения l oop:

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;});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...