2010-08-26 20 views
7

Supponiamo di avere il seguente problema: vogliamo leggere un insieme di coordinate (x, y) e un nome, quindi ordinarli in ordine, aumentando la distanza dall'origine (0, 0). Ecco un algoritmo che usano più semplice bubble sort:trova la posizione più vicina dal punto originale

#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; 
    } 

Ma io voglio scrivere STL algoritmo di ordinamento, invece di bubble sort. Come si fa?

Voglio dire, come dovrei usare la funzione dist nell'algoritmo di ordinamento STL?

risposta

8

La funzione di ordinamento STL std::sort può utilizzare una funzione di confronto definita dall'utente (o oggetto funzione) come terzo argomento opzionale. Quindi, se avete i vostri articoli in esempio:

vector<point> points; 

Si possono ordinare chiamando:

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

dove my_comp() è una funzione con il seguente prototipo:

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

+ 1. Se 'point' è grande, potrebbe essere più efficiente avere' my_sort() 'prendere riferimenti const a' point' invece di copiare gli oggetti. –

+0

Buona chiamata. Risposta aggiornata di conseguenza. –

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); 
Problemi correlati