如何对浮动的多维向量进行排序?

时间:2015-02-14 06:16:45

标签: c++ sorting vector priority-queue

所以,我在3D中有一组点,我想将它们存储在一个三维向量中。然后我需要对该向量进行排序,首先优先考虑X维度,然后是Y,然后是Z.所以,例如,如果我有这一组点:

P1 = (5, 10 ,9)
P2 = (1, 11, 4)
P3 = (8, 5, 2)
P4 = (5, 10, 3)
P5 = (5, 4, 0)

我想得到一个像这样排序的矢量:

[1, 11, 4]
[5, 4, 0]
[5, 10, 3]
[5, 10, 9]
[8, 5, 2]

那么,如何对多维数据向量进行排序以考虑所有行? 我应该使用std::priority_queue吗?如果是这样,我如何使用它?

由于

3 个答案:

答案 0 :(得分:3)

您可以使用std::tuple<double, double, double>来表示某个点。 comparison for std::tuple以词典方式按照您希望的方式工作。或者,您可以为点向量提供自定义排序功能。像这样:

sort(pointVector.begin(), pointVector.end(), [](const Point& lhs, const Point& rhs){//Implement your required comparison predicate here});

另外,正如this question所示,您可以使用std::tuple词典排序和std::tie来实现某种带有词典排序的命名元组。

答案 1 :(得分:2)

...首先给予X维度优先权,然后是Y,然后是Z

std::sortstd::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 :(得分:2)

您可以使用std::sort()根据具体情况轻松排序,制作自己的比较器功能。

假设您在struct point中存储了一个3D点,并且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); 
}