Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Ordinare una mappa in ordine decrescente in base al valore
Forum - C/C++ - Ordinare una mappa in ordine decrescente in base al valore

Avatar
cassin.simone (Member)
Guru


Messaggi: 1051
Iscritto: 03/06/2009

Segnala al moderatore
Postato alle 16:56
Giovedì, 18/03/2010
Ciao a tutti, vengo per porvi un problemino magari per molti di voi banale, ma che io non riesco a risolvere. Premetto che sto studiando c++ quindi sono ben accette le critiche ma perdonate l'ignoranza.
Sto utilizzando per un programma una std::map nel seguente modo:
Codice sorgente - presumibilmente Plain Text

  1. map<char,int>frequences;


Mi interesserebbe in qualche modo ordinare in ordine decrescente i valori della mappa in base al valore (ovvero un int). Per chiarirci: se io ho una mappa elaborata dal programma nel seguente modo:
Codice sorgente - presumibilmente Plain Text

  1. frequences['a']=23;
  2. frequences['b']=11;
  3. frequences['c']=55;
  4. frequences['d']=6;


vorrei che me le ordinasse nel seguente modo:
Codice sorgente - presumibilmente Plain Text

  1. frequences['c']=55;
  2. frequences['a']=23;
  3. frequences['b']=11;
  4. frequences['d']=6;



Grazie a tutti in anticipo :k:

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 18:00
Giovedì, 18/03/2010
le map sono ordinate per chiave, non per valore...

dovresti creare un:

Codice sorgente - presumibilmente C/C++

  1. std::map<char, int> dizionario;
  2. std::vector< std::pair< int, char >> vettoreDiSupporto;



copiarci dentro il contenuto della map

Codice sorgente - presumibilmente C/C++

  1. std::map<char, int>::const_iterator it;
  2.  
  3. for ( it = dizionario.begin(); it != dizionario.end(); it++ )
  4.   vettoreDiSupporto.push_back( std::pair<int, char>(it->second, it->first) );



e poi dovresti ordinarlo:

Codice sorgente - presumibilmente Plain Text

  1. std::sort(vettoreDiSupporto);



A occhio e croce questo dovrebbe risolvere il tuo problema :)

Ultima modifica effettuata da TheKaneB il 18/03/2010 alle 18:03
PM Quote
Avatar
Matthew (Member)
Expert


Messaggi: 387
Iscritto: 29/01/2007

Segnala al moderatore
Postato alle 18:06
Giovedì, 18/03/2010
Le map, come sai già, contengono due valori: una key e un mapped value.
Le key serve ad ordinare gli elementi "mappati". Gli elemementi sono ordinati in ordine crescente in base alla loro chiave. Non ci sono funzioni per ordinare gli elementi in maniera diversa. Questo sistema automatico di ordinamento è la caratteristica principale delle map.
Se vuoi ordinare gli elementi in base al loro valore, a questo punto a cosa ti servirebbe la chiave di ordinamento? :rotfl:

[EDIT:] chiedo scusa, ho postato contemporaneamente a theKaneB...:rotfl:

Ultima modifica effettuata da Matthew il 18/03/2010 alle 18:07
PM Quote
Avatar
cassin.simone (Member)
Guru


Messaggi: 1051
Iscritto: 03/06/2009

Segnala al moderatore
Postato alle 19:19
Giovedì, 18/03/2010
Testo quotato

Postato originariamente da Matthew:
Non ci sono funzioni per ordinare gli elementi in maniera diversa.


Pensavo di si 8-|
:rotfl:

PM Quote
Avatar
cassin.simone (Member)
Guru


Messaggi: 1051
Iscritto: 03/06/2009

Segnala al moderatore
Postato alle 17:00
Venerdì, 19/03/2010
Grazie a tutti! Ieri sera sono riuscito a implementare ciò che TheKaneB aveva suggerito :hail: :rotfl:
A chi interessasse ho scoperto nella documentazione che esiste un metodo che è l'esatto contrario di std::sort ed è std::reverse che ordina il vettore in ordine decrescente. Ma questo scommetto che molti di voi lo sanno già vero? :D

PM Quote