... отдавая приоритет сначала размеру X, затем Y, затем Z
blockquote>Используйте
std::sort
сstd::tie
, что-то вроде следующих#include <algorithm> #include <tuple> //.... struct Points // Your 3D Point { float x,y,z; } ; std::vector<Points> v; // Vector of 3D points std::sort( v.begin(), v.end(), []( const Points& lhs, const Points& rhs ) { return std::tie(lhs.x,lhs.y,lhs.z) < std::tie(rhs.x,rhs.y,rhs.z) ; } ) ;
Вы можете использовать std::tuple<double, double, double>
для представления точки. Сравнение для std::tuple
работает лексикографически, как вы этого хотите. В качестве альтернативы вы можете предоставить пользовательскую функцию сортировки для вашего вектора точек. Что-то вроде этого:
sort(pointVector.begin(), pointVector.end(), [](const Point& lhs, const Point& rhs){//Implement your required comparison predicate here});
Также, как , этот вопрос показывает, что вы можете выполнить некоторую сортировку с именем-tuple-with-lexicographic с помощью std::tuple
s лексикографический сорт и std::tie
.
Вы можете использовать std::sort()
, чтобы легко сортировать в соответствии с вашими конкретными условиями, создав собственную функцию компаратора.
Предполагая, что вы сохранили одну трехмерную точку в struct point
, а точки в std::vector<points>
(A std::tuple
могут быть более полезными.), попробуйте этот код.
Пример:
#include <vector>
#include <algorithm>
using namespace std;
struct point
{
float x, y, z;
}
bool mySort(const point& a, const point& b)
{
//A naive comparison to help you understand better.
//You could always use std::tie for lexicographical comparison.
if (a.x == b.x)
{
if (a.y == b.y)
return a.z < b.z;
else
return a.y < b.y;
}
else
return a.x < b.x;
}
int main()
{
vector<point> graph;
//push_back() all your points into the graph.
//mySort() is a custom comparator function.
sort(graph.begin(),graph.end(),mySort);
}