2010-08-26 16 views
7

Supongamos que tenemos el siguiente problema: queremos leer un conjunto de coordenadas (x, y) y un nombre, luego ordenarlos en orden, aumentando la distancia desde el origen (0, 0) Aquí es un algoritmo que utilizan más simple ordenamiento de burbuja:encuentra la ubicación más cercana al punto original

#include<iostream> 
    #include <algorithm> 
    using namespace std; 
    struct point{ 
     float x; 
     float y; 
     char name[20]; 

     }; 
     float dist(point p){ 
      return p.x*p.x+p.y*p.y; 
      } 
     void sorting(point pt[],int n){ 
      bool doMore = true; 
     while (doMore) { 
      doMore = false; // Assume no more passes unless exchange made. 
      for (int i=0; i<n-1; i++) { 
       if (dist(pt[i]) > dist(pt[i+1])) { 
        // Exchange elements 
        point temp = pt[i]; pt[i] = pt[i+1]; pt[i+1] = temp; 
        doMore = true; // Exchange requires another pass. 
       } 
      } 
     } 

     } 
     void display(point pt[],int n){ 
      for (int i=0;i<n;i++){ 
       cout<<pt[i].name<< " "; 
        } 
     } 
    int main(){ 
    point pts[1000]; 
    int n=0; 

    while (cin>>pts[n].name>>pts[n].x>>pts[n].y){ 
     n++; 

    } 
    sorting(pts,n); 
    display(pts,n); 

    return 0; 
    } 

Pero yo quiero escribir algoritmo de ordenación STL en lugar de ordenamiento de burbuja. ¿Cómo hacer eso?

Quiero decir que, ¿cómo debo usar la función dist en el algoritmo de ordenamiento STL?

Respuesta

8

La función de clasificación de STL std::sort puede tomar una función de comparación definida por el usuario (u objeto de función) como un tercer argumento opcional. Así que si usted tiene sus artículos en, por ejemplo:

vector<point> points; 

Puede ordenarlas llamando al:

sort(points.begin(), points.end(), my_comp); 

donde my_comp() es una función con el siguiente prototipo:

bool my_comp(const point &a, const point &b) 
+1

+ 1. Si 'point' es grande, puede ser más eficiente que' my_sort() 'tome referencias a' point' en lugar de copiar los objetos. –

+0

Buena llamada. Respuesta actualizada en consecuencia. –

2
#include <algorithm> 

bool sort_by_dist(point const& p1, point const& p2) { 
    return dist(p1) < dist(p2); 
} 

... 

std::sort(pt, pt + n, sort_by_dist); 
Cuestiones relacionadas