Newsgroup: it.comp.lang.c++
Titolo: ordinamento di una map secondo i valori

Salve, molto probabilmente il mio č un problema banale, ma devo dire che
finora non sono riuscito a trovare una soluzione (attenzione : conosco
pochissimo la stl).
Dunque, faccio un esempio con tre soli elementi,per essere chiaro:
std::map<char,int> m;
m['a']=100;
m['b]=10;
m['c']=1;
ora, se vado a visualizzare gli elementi nell'ordine
dell'iteratore,ovviamente compariranno ordinati secondo la chiave, e quindi:
'a'  'b'  'c'
Ora chiedo: esiste un modo, il piů immediato possibile, per fare in modo che
l'ordine degli elementi nella mappa sia basato sui valori anziché sulle
chiavi ?
In tal caso l'ordine di visualizzazione dovrebbe essere:
'c'  'b'  'a'
... se non č possibile, quale altro metodo si puň usare per far sě che da
qualche parte venga memorizzato l'elenco degli elementi nella mappa ordinato
perň in base ai valori e non alle chiavi ??
Grazie per l'eventuale aiuto.
--
"Solo gli idioti non hanno dubbi."
"Ne sei sicuro?"
"Certo."
Georges Courteline

 chiavi ?
hai provato ad usare una set: set<Key, Compare, Alloc> , usando i tuoi dati
come chiave?
--
Ciao.
Maurizio
P.S.: eliminare _NO_SPAM per rispodere in privato

 sulle chiavi ?
L'implementazione GNU della stl si basa su di un albero binario. Per cui 
l'ordine in cui sono memorizzati i dati dipende fortemente dall'ordine 
delle chiavi ( normalmente le ricerche sono fatte per chiavi, ed è logico 
organizzare i dati in modo da ottimizzare la ricerca in tal senso ).
Difatti al tipo map si può passare anche un  operatore di confronto.
template <class _Key, class _Tp, class _Compare = less<_Key>,
          class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
   class map {
Ottenere un'altro ordinamento ( per esempio per valori ) ha un costo 
equivalente a creare un'altra map(pa) compelementare in cui al posto delle 
chiavi ci sono i valori e viceversa...
Ho provato ad utilizzare l'algoritmo di sort standard della stl ma sensa 
successo.
Riporto un po' di codice per rendere l'idea
------------------------------------------------
#include <iostream>
#include <map>
using namespace ::std;
template <typename TT> void print( TT &m ){
        typename TT::iterator i;
        for( i=m.begin( ) ; i != m.end( ) ; i++ )
                cout << i->first << ", " << i->second << endl;
}
int main( ){
        map<char,int>   m1;
        map<int,char>   m2;
        m1['a']=1;
        m1['b']=10;
        m1['c']=100;
        m1['d']=25;
        m1['r']=21;
        print(m1);
        for( map<char,int>::iterator i=m1.begin( ) ; i != m1.end( ) ; i++ )
                m2.insert(map<int,char>::value_type(i->second,i->first));
        print(m2);
        return 0;
}
-------------------------------------
[gbaroncelli@isacco tmp]$ /usr/local/bin/g++ -Wall -o prova2 prova.cc
[gbaroncelli@isacco tmp]$ ./prova2
a, 1
b, 10
c, 100
d, 25
r, 21
1, a
10, b
21, r
25, d
100, c

 come chiave?
Ehm... non ci ho pensato (cvd: scarsa conoscenza della stl!) ...
Quindi è possibile utilizzare un set come alternativa alle mappe quando si
vuole che l'ordine sia basato sui valori ? O l'approccio è sostanzialmente
differente ?
Grazie comunque per il consiglio.

         return 0;
Sì, questa è una soluzione, ma mi sembra piuttosto arzigogolata e non
"diretta" ...
Forse la soluzione giusta è usare un set al posto della map, come mi ha
suggerito Maurizio. Grazie anche a te.

 differente ?
Se guardi la dichiarazione delle due, vedi che c'è differenza. Nella mappa,
associ al tuo data una chiave di ricerca, come quando, ad esempio, vuoi
memorizzare i giorni del mese. Quindi come chiave userai il nome del mese,
mentre il dato saranno i giorni.
Nel caso della set hai solo i giorni del mese, li puoi avere ordinati in
base alla compare, ma non puoi associare ad essi una chive di ricerca.
tornardo all'esempio di prima, non potrai fare la ricerca del 5 marzo, ma
potrai solo fare la ricerca del 5, senza sapere a che mese appartiene.
Quando usare l'una o l'altra, purtroppo, non hai una regola certa...come
sempre...dipende da quello che devi fare.


 mentre il dato saranno i giorni.
Scusatemi, per fare questo, si deve usare una multimap, che consente di
inserire dati con chiave non univoca ;-).
Però, il discorso non cambia. L'utilizzo della mappa è indicato nel momento
in cui devi dare al tuo dato un nome, per poterlo identificare, e
distinguerlo da altri dati. Pensa ad una persona, per la quale devi
memorizzare peso, altezza, pressione, valori del sangue, etc.. Dove, i
singoli valori (90, 180, 125, ... ), da soli non avrebbero significato, ma,
se gli associ una chiave, allora il gioco cambia: PESO 90, ALTEZZA 180,
PRESSIONE 125.
