2010-10-05 7 views
1

J'ai le code suivant:sorte coordonnées par x valeur

#include <vector> 
using namespace std; 
struct Point 
{ 
    int x, y; 
}; 
bool Sort(struct Point& a,struct Point& b){ 
    return a.x<b.x; 
} 
int main(int argc, char *argv[]) 
{ 
    vector<Point>a; 
    for (int i=0;i<10;i++){ 
    cin>>a[i].x>>a[i].y; 
    } 
    sort(a,10,Sort); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 

mais il semble mal. Pouvez-vous s'il vous plaît me dire la forme correcte de la fonction de tri à utiliser?

+0

Par "il semble faux" voulez-vous dire "il ne compile pas?" –

+1

Cette fonction 'Sort()' est vôtre, car elle ne fonctionne pas du tout. Au lieu de cela, il est utilisé par la fonction de tri à __compare__ elements. Quelque chose comme 'CompareByX()' pourrait être plus approprié. – sbi

Répondre

0

Je pense que ce devrait être quelque chose comme ceci:

static bool Sort(const Point& a, const Point& b) { 
    return a.x<b.x; 
} 

Pas tout à fait. Voir le commentaire

+0

NM, la mise en forme suggérée 'Sort' était une méthode de Point. – tdammers

3

Vous devez spécifier l'itérateur de début et de fin pour la fonction de tri. Cela peut être fait en utilisant les fonctions a.begin() et a.end().

std::sort(a.begin(), a.end(), Sort); 

En outre, Le defn sous-jacente » devrait être:

bool Sort(const Point& a,const Point& b) const 

{

+0

il peut être nécessaire de déplacer la méthode 'Sort()' en dehors de la classe (make it global), ou en faire une méthode statique de la classe, ou de créer un objet fonction contenant un opérateur booléen() (const Point & , const Point & b) {...} '. stl 'sort' peut prendre un pointeur de fonction (qui peut être une fonction globale ou une fonction membre statique) ou un objet fonction, mais pas une fonction membre d'instance. – rwong

+0

@rwong: C'était en fait une fonction globale, mais le formatage était assez effroyable et cela ressemblait à une méthode de classe. Je viens de le réparer. – Gorpik

0
#include <vector> 
#include <algorithm> 
#include <iostream> 
using namespace std; 

struct Point 
{ 
    int x, y; 
}; 

bool PCompare(const struct Point& a, const struct Point& b) { 

    if(a.y < b.y) 
     return true; 
    if(a.y > b.y) 
     return false; 
    return a.x<b.x; 
} 

int main(int argc, char *argv[]) 
{ 
    vector<Point> a; 
    for (int i=0;i<10;i++) { 
     Point p ; 
    cin>>p.x>>p.y; 
    a.push_back(p); 
    } 

    sort(a.begin(), a.end(), PCompare); 
    system("PAUSE"); 
    return EXIT_SUCCESS; 
} 
2

Une autre solution dans votre cas est d'utiliser liste au lieu de vecteur et la surcharge opérateur <:

#include <iostream> 
#include <algorithm> 
#include <list> 

struct Point 
{ 
    int x, y; 

    bool operator<(const Point & p) 
    { return this->x < p.x; } 
}; 

void print(Point p) 
{ 
    std::cout << "Point (x,y): (" << p.x <<", " << p.y << ")" << std::endl; 
} 

// just for example 
bool Reverse(const Point &p1, const Point &p2) 
{ return p1.x > p2.x; } 

int main() 
{ 
    std::list<Point> a; 

    for(int i = 0; i < 10; ++i) 
    { 
     Point p; 
     std::cin >> p.x >> p.y; 
     a.push_back(p); 
    } 

    a.sort(); 
    std::for_each(a.begin(), a.end(), print); 

    std::cout << std::endl; 

    a.sort(Reverse); 
    std::for_each(a.begin(), a.end(), print); 
} 

std :: liste fournit des algorithmes spécialisés uniques à des listes liées, telles que l'épissage, le tri et l'inversion en place.

+0

Si vous êtes prêt à trier vos données fréquemment, une liste est sans aucun doute avantageuse. Encore plus pour un gros tas de données. – j4x

Questions connexes