2016-05-23 12 views
0

Angenommen, ich habe 10 Punkte mit den Koordinaten (x, y) .i die Punkte in irgendeiner Art und Weise sortieren, muß (1), die x Wert kleiner als andere in früheren Position sein werden als andere (2) wenn x Wert von zwei Punkten sind die gleichen dann die y Wert ist weniger als andere werden in früherer Position.So wie kann ich diese Punkte sortieren?Wie sortiere ich die Koordinaten für x- oder y-Werte der Koordinaten?

+5

Neben ein C++ Buch zu lesen, ich an der Vergleichs- Funktion aussehen würde Sie können sortieren() übergeben. –

+0

['std :: pair'] (http://en.cppreference.com/w/cpp/utility/pair) hat 'operator songyuanyao

Antwort

3

einen Lambda-Ausdruck verwenden:

std::sort(pts.begin(), pts.end(), [](const auto& a, const auto & b) { 
    return a.x < b.x || (a.x == b.x && a.y < b.y); 
}); 

Nicht alle Compiler auto als Lambda-Parametertyp akzeptieren. Daher müssen Sie möglicherweise anstelle von auto den korrekten Typnamen verwenden.

Wenn Sie eine Struktur verwenden, definiert ein Benutzer weniger als Operator helfen sollte:

struct Point 
{ 
    int x, y; 
}; 

bool operator<(const Point& a, const Point& b) 
{ 
    return a.x < b.x || (a.x == b.x && a.y < b.y); 
} 

Um eine std::vector<Point> nach Ihren Wünschen zu sortieren, müssen Sie nur noch

std::sort(pts.begin(), pts.end()); 

schreiben und es wird Ihren benutzerdefinierten Kleiner-als-Operator verwenden.

5

Ganz einfach:

#include <algorithm> 
#include <utility> 
#include <vector> 


std::vector<std::pair<int, int>> points; 

// populate 

std::sort(points.begin(), points.end()); 
+0

Also ist 'std :: pair' von der ersten zur zweiten geordnet? –

+3

@AndreasH. Siehe [operator ==,! =, <,<=,>,> = (std :: pair)] (http://en.cppreference.com/w/cpp/utility/pair/operator_cmp), "Vergleicht lhs und rhs lexikographisch, das Ist, vergleicht die ersten Elemente und nur wenn sie äquivalent sind, vergleicht die zweiten Elemente. " – songyuanyao

Verwandte Themen