Newsgroup: it.comp.lang.c++
Titolo: perché usare gli iteratori negli algoritmi standard?

voglio dire, perché invece di
sort(v.begin(), v.end());
non si poteva fare un sort direttamente con il container?
sort(v);
???
forse c'è qualche sottigliezza che mi sfugge?
-- 
]\/[ad]\/[age (
www.mindreamz.net
)
"Un Maestro insegue semplicemente la sua visione di Eccellenza in
qualunque cosa sta facendo e lascia agli altri decidere se sta 
lavorando o giocando. A lui sembra sempre di fare entrambe." - Anonimo

Penso che sia perche gli algoritmi di ordinamento del C++ standard si basino
su iteratori.
Quindi passando direttamento l'oggetto non avresti gli iteratori.
*IMHO*
-- 
Kleidemos
C++ Programmer
kleidemo...@altervista.org

 forse c'è qualche sottigliezza che mi sfugge?
 >
Perche' la filosofia di base della STL (o, meglio, di quella parte della 
libreria standard C++ che viene spesso chiamata STL) e' la GENERICITA'.
sort(v) rappresenta solo un particolare caso, corrispondente a 
sort(v.begin(), v.end()), mentre sort(first, last) e' applicabile in 
tutti i casi.
Quindi chi ha definito lo standard ha pensato: perche' aggiungere un 
sort(container), quando puoi avere un piu' generico sort(first, last)?
Poi nessuno ti vieta di definirti un template sort(container), che non 
fara' altro che chiamare std::sort(container.begin(), container.end()).
;-)
-- 
Roal Zanazzi

 ;-)
Un wrapper insomma?


 
Why not, da un container puoi avere almeno gli iteratori a begin() e end().
-- 
Roal Zanazzi

 applicati agli iteratori...
Genericità di tipo?


 
Dipende da quale signicato dai alla parola wrapper :-)
Diciamo tendenzialmente si', una funzione wrapper (ma tanto generica 
quanto lo e' la sort(first, last)).
-- 
Roal Zanazzi

 
Non proprio. Direi piu' "separazione dei compiti", e "indipendenza tra 
le parti", nell'ottica di una maggiore genericita' e riutilizzabilita' 
del meccanismo.
Gli iteratori sono il mezzo piu' generico possibile per "navigare"
e accedere agli elementi contenuti in un container.
In pratica permettono a chi li usa (es. agli algoritmi) di non avere 
relazione diretta con il container.
Questo concetto si chiama "disaccoppiamento" (decoupling) e permette un 
migliore e maggiore riutilizzo delle varie parti in gioco.
Tant'e' che e' possibile, ad esempio,  pensare ad algoritmi applicati a 
oggetti che non sono "direttamente" dei container (es. stream), tramite 
degli adattatori che fanno le veci degli iteratori.
N.B. questo e' uno dei concetti utilizzati soprattutto in OOP per avere 
sistemi piu' manutenibili e flessibili.
-- 
Roal Zanazzi

 non si poteva fare un sort direttamente con il container?
E se io volessi fare un sort solo su una parte degli elementi del container?
Quella utilizzata è la scelta più generica, più potente (perché ti da più
scelte) e più in linea con la filosofia degli oggetti della libreria
standard.
comunque puoi sempre farti...
void miosort(T& v)
{
        sort(v.begin(),v.end());
}

sistemi piu' manutenibili e flessibili.
sono piuttosto scettico riguardo a questo argomento... nel senso che
teoricamente ciò che dici è più che giusto, ma è po' la differenza tra
la matematica e l'ingegneria, in matematica tutto "è giusto" e
"funziona"... ma spesso non è utile, è inutilmente complesso per la
realtà, ecc.
il discorso del disaccoppiamento e della possibilità del riutilizzo è
profondamente ottimo, ma questo sembra non considerare la realtà e
cioè che, ad esempio in questo caso, milioni di volte verrà scritto
sort(v.begin(), v.end());
e solo qualche decina qualcosa di più complesso... e allora, mi chiedo
io, perché non mettere un sort che accetta un container direttamente?
la risposta è: fattelo da solo... di nuovo, questo è molto sensato, ma
perché farlo fare e rifare a milioni di persone, invece di farlo nella
libreria standard?
è un po' lo stesso discorso che si può fare per il solito passaggio da
int a std::string... viene chiesto su questo ng almeno una volta alla
settimana... perché non inserire una funzione per farlo? (non dico un
cast implicito, perché chiaramente sarebbe dannoso)


ho aperto un thread poco piů sotto, l'argomento mi sembra complesso e
comunque č Off Topic in questo thread
