Newsgroup: it.comp.lang.c++
Titolo: Ordinamento A-Z

Salve a tutti, ho una rubrica telefonica fatta in C++, ma vorre che i
nominativi alla lettura della rubrica fossero in ordimìne alfabetico, non
esiste un algoritmo che fa questo?
GRAZIE

 nominativi alla lettura della rubrica fossero in ordiměne alfabetico, non


 non esiste un algoritmo che fa questo?
Con l'algoritmo std::sort della libreria standard.
Ad esempio:
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
using std::cout;
using std::endl;
struct elemento
{
    elemento(std::string n, std::string c):nome(n),cognome(c){};
    std::string nome;
    std::string cognome;
    bool operator<(const elemento& altra) const
    {
        return (cognome<altra.cognome);
    }
};
int main()
{
    std::vector<elemento> rubrica;
    rubrica.push_back(elemento("Pippo", "Pelo"));
    rubrica.push_back(elemento("Giuseppe", "Verdi"));
    rubrica.push_back(elemento("Alessandro", "Manzoni"));
    cout << rubrica[0].cognome << " " << rubrica[0].nome << endl;
    cout << rubrica[1].cognome << " " << rubrica[1].nome << endl;
    cout << rubrica[2].cognome << " " << rubrica[2].nome << endl;
    cout << endl;
    std::sort(rubrica.begin(),rubrica.end());
    cout << rubrica[0].cognome << " " << rubrica[0].nome << endl;
    cout << rubrica[1].cognome << " " << rubrica[1].nome << endl;
    cout << rubrica[2].cognome << " " << rubrica[2].nome << endl;
}
ciao
--
Gerolamo

     }
scusa, ma così, in caso di cognome uguale, che fa lo std::sort()?
non dovremmo fare:
    bool operator<(const elemento& altra) const {
        if(!(cognome==altra.cognome))
            return (cognome<altra.cognome);
        else
            return (nome<altra.nome);
    }
imo, ovviamente.
--
Lupin85©
Azzurranet IRC: +#afiad, @#fils - ICQ: 91528290
Mail: Remove PAN to contact me
- "It is not important what you believe, only that you believe." -

 imo, ovviamente.
Oppure un oggetto funzione.
class ConfrontaPersone
{
public:
	bool operator() (const person& p1, const person& p2) const
	{
		if (p1.cogn < p2.cogn)
			return true;
		else
			return (p1.nome < p2.nome)
	}
};
e poi chiami sort (v.begin(), v.end(), ConfrontaPersone());
-- 
Andrea Bergia - studente 	  Linux Registred User #281550
Per favore non mandatemi allegati in Word o PowerPoint.
Si veda 
http://www.fsf.org/philosophy/no-word-attachments.html

 scusa, ma così, in caso di cognome uguale, che fa lo std::sort()?
Implementation dependent.  Se vuoi sapere cosa succede (:== se vuoi un
sort stabile) c'e' std::stable_sort.
-- 
Maurizio Loreti                         
http://www.pd.infn.it/~loreti/mlo.html
Dept. of Physics, Univ. of Padova, Italy          loreti at pd dot infn dot it

             return (p1.nome < p2.nome)
	if ( p1.cogn == p2.cogn )
	  return p1.nome < p2.nome;
	else
	  return p1.cogn < p2.cogn;
Ciao,
Nicola

 	  return p1.cogn < p2.cogn;
return ( p1.cogn == p2.cogn )?p1.nome < p2.nome:p1.cogn < p2.cogn;
;)
-- 
Luc.

 sort stabile) c'e' std::stable_sort.
utilizzando l'operatore che ho scritto su si evitano situazioni di stallo?


 e poi chiami sort (v.begin(), v.end(), ConfrontaPersone());
scusa, ma così non ci complichiamo un po' la vita?
e poi c'è un errore nell'operatore, che ha corretto Nicola.


Nicola Musatti ha scritto:

ok, ma cosě si sposta il problema, non  lo si risolve:
in caso di cognomi E nomi uguali?
Come dice il prof. Loreti, chi ti dice che succede č lo stable_sort
--
Gerolamo

 Come dice il prof. Loreti, chi ti dice che succede č lo stable_sort
Ma di che succede in questo caso non te ne importa niente. stable_sort 
fornisce garanzie sul comportamento in caso di uguaglianza, ma questo 
non aiuta particolarmente nell'ambito specifico del problema.
Ciao,
Nicola

 Come dice il prof. Loreti, chi ti dice che succede č lo stable_sort
non vedo perche` usare stable_sort in questo caso: stable_sort garantisce 
solo di preservare l'ordinamento relativo degli elementi che hanno 
valore uguale, ma all'utente cosa importa?
Magari i record da ordinare sono presi da una hash table: come utente io 
mi sentirei molto piu` sollevato nel sapere che quello che vedo su 
schermo e` l'ordine in cui i nomi uguali erano memorizzati nell'hash 
table :-)
ciao Anto
-- 
"Computer science is not about computers any more than astronomy
is about telescopes." -- EW Dijkstra

 non vedo perche` usare stable_sort in questo caso:
Personalmente, visto che l'OP non interviene, avevo spostato il
problema da quello originale alla domanda di Lupin85:
"scusa, ma così, in caso di cognome uguale, che fa lo std::sort()?"
e la risposta è: Implementation dependent. Se lo vuoi sapere
devi usare stable_sort.
--
Gerolamo