如何在C++中按z值对3D坐标vector进行排序?
按Z值排序存储3D坐标的vector
你的需求是对扁平存储的3D坐标vector(格式为{x0,y0,z0,x1,y1,z1,...})按每个点的Z值排序,以下是两种C++实现方案:
方法1:转换为点结构排序(可读性优先)
这种方法先将扁平数据转换为结构化的点集合,排序后再转回扁平vector,代码直观易懂,适合数据量不大的场景:
#include <vector> #include <algorithm> #include <array> using float64 = double; // 确保float64与double匹配,根据实际定义调整 void sortContourByZ(std::vector<float64>& contourdata) { // 校验数据完整性:必须是3的倍数长度 if (contourdata.size() % 3 != 0) { return; // 可根据需求替换为异常抛出等错误处理逻辑 } // 拆分扁平数据为点集合 std::vector<std::array<float64, 3>> points; points.reserve(contourdata.size() / 3); for (size_t i = 0; i < contourdata.size(); i += 3) { points.push_back({contourdata[i], contourdata[i+1], contourdata[i+2]}); } // 按Z值升序排序(降序则将<改为>) std::sort(points.begin(), points.end(), [](const auto& a, const auto& b) { return a[2] < b[2]; }); // 将排序后的点写回原始vector size_t idx = 0; for (const auto& point : points) { contourdata[idx++] = point[0]; contourdata[idx++] = point[1]; contourdata[idx++] = point[2]; } }
方法2:索引排序(性能优先)
如果处理的是大数据量,不想额外拷贝点数据,可以通过对索引排序来减少内存开销:
#include <vector> #include <algorithm> using float64 = double; void sortContourByZ(std::vector<float64>& contourdata) { if (contourdata.size() % 3 != 0) { return; } const size_t pointCount = contourdata.size() / 3; std::vector<size_t> indices(pointCount); // 初始化索引列表 for (size_t i = 0; i < pointCount; ++i) { indices[i] = i; } // 按对应点的Z值排序索引 std::sort(indices.begin(), indices.end(), [&contourdata](size_t a, size_t b) { const float64 zA = contourdata[a * 3 + 2]; const float64 zB = contourdata[b * 3 + 2]; return zA < zB; // 升序排序,降序替换为> }); // 根据排序后的索引构建新的扁平vector std::vector<float64> sortedData; sortedData.reserve(contourdata.size()); for (size_t idx : indices) { sortedData.push_back(contourdata[idx * 3]); sortedData.push_back(contourdata[idx * 3 + 1]); sortedData.push_back(contourdata[idx * 3 + 2]); } // 替换原始vector(swap操作高效,避免内存拷贝) contourdata.swap(sortedData); }
关键注意事项
- 必须先校验
contourdata的长度是3的倍数,否则数据不完整,排序无意义。 - 调整排序顺序:升序用
<,降序用>,直接修改比较函数即可。 - 如果你的
float64不是double的别名(比如某些平台的自定义类型),需要同步调整代码中的类型匹配。
内容的提问来源于stack exchange,提问作者user19190785
相关产品推荐
相关产品推荐

