如何使用 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 列表中的迭代器访问指向结构的指针而不是其元素
如果我创建一个结构并将其放入向量中,它是驻留在堆上还是堆栈上?