Правильный способ std :: sort std :: vector N-мерных плавающих точек [duplicate]

1
задан The Paramagnetic Croissant 14 February 2015 в 07:30
поделиться

3 ответа

... отдавая приоритет сначала размеру X, затем Y, затем Z

Используйте 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)  ; 

            }
         ) ;

DEMO

2
ответ дан P0W 26 August 2018 в 06:16
поделиться

Вы можете использовать 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 .

3
ответ дан Community 26 August 2018 в 06:16
поделиться

Вы можете использовать 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); 
}
2
ответ дан shauryachats 26 August 2018 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: