Newsgroup: it.comp.lang.c++
Titolo: dubbio su STL

Anche se per l'eta' avanzata e le mie reali
necessita' non imparero' mai a pensare ad oggetti
e rimarro' ancorato al vecchio C, ho realizzato
che un po' di feature non troppo spinte del c++
potrebbero essermi utili, parlo in particolare
del meccanismo dei template e della STL.
Ora, data la mia ignoranza sul c++, e quindi
la conseguente insicurezza che mi prende maneggiandolo,
avrei qualche dubbio sulla STL.
Quello che mi chiedo e' : quanto e' standard
la STL ?
Ho provato a seguire un testo che ho
trovato nella nostra biblioteca, apparentemente
nemmeno troppo vecchio (Robert Robson: Using the STL),
ma svariati esempi non mi compilano.
Per esempio, supponendo di aver definito
una classettina Rec (in pratica una struct con due elementi...)
con il suo bravo operatore <,
per fare una priority_queue di oggetti Rec il libro
mi induce a scrivere
priority_queue< vector<Rec>, less<Rec> > pq;
che fa andare giu' di testa il mio fido gcc (o g++).
Invece definendo banalmente
priority_queue< Rec > pq;
le cose funzionano perfettamente.
Cosa mi sta sfuggendo ? (a parte l'ignoranza di fondo..)
g.

 Cosa mi sta sfuggendo ? (a parte l'ignoranza di fondo..)
Non ripori l'errore che da il compilatore.
Banalmente potrebbe essere:
includi <vector>?
includi <functional>?
hai messo lo spazio (sembra di si) tra i due ">" vicini?
Insomma, dacci qualche dettaglio in più (anche la versione del
compilatore, già che ci sei...)
ciao
-- 
Gerolamo
www.overweb.it

 compilatore, già che ci sei...)
uso il gcc 2.95 (volendo il 3.2.2).
Penso di aver capito, piu' o meno;
credo che il problema sia proprio nella diversa
definizione di priority_queue:
semplificando al massimo:
con il gcc 2.95
per creare una priority_queue di interi mi basta fare
priority_queueu<int> ciccio;
oppure posso specificare il container soggiacente da usare:
priority_queueu<int, vector<int>, less<int> > foobar;
secondo il libro dovevo invece passare SEMPRE un Container e
un confronto, (ma non il tipo!) e quindi fare una cosa come:
priority_queue< vector<int>, less<int> > ciccio;
se passo questa linea al gcc, lui si incarta, perche'
probabilmente non ha un template fatto in quel modo, e mi dice:
belch.cpp:21: no type named `value_type' in `struct less<int>'
belch.cpp:21: template argument 1 is invalid
belch.cpp:21: template argument 3 is invalid
belch.cpp:21: ANSI C++ forbids declaration `ciccio' with no type
mentre le dichiarazioni
priority_queueu<int> ciccio;  e
priority_queueu<int, vector<int>, less<int> > foobar;
gli vanno bene.
Credo che il problema sia questo.
Al momento ho risolto buttando il libro e rifacendomi ad esempi
e tutorial on-line.....
ciao,
g.

 gli vanno bene.
cioe', gli vanno bene se scrivo queue invece di queueu....
g.

 priority_queue< vector<Rec>, less<Rec> > pq;
Ma ti serve proprio una priority_queue?
Perche non usare un container che ti risponde piu'
alle tue esigenze e farci sopra un sort quando
ti serve ?
G.


Siccome devo fare ripetutamente delle inserzioni e
ripetutamente estrarre il record con la
chiave piu' piccola (o piu' grande a seconda
di come ho settato il confronto nella definizione
della coda), la priority_queue (che presumo venga
implementata come uno heap) mi sembra la struttura
dati piu' appropriata.
Tieni conto che per estrarre l'elemento in cima
o per inserire un elemento generico la priority_queue
ha un costo dell'ordine di log(n) (dove n sono gli oggetti).
mentre fare il sort ha un costo proporzionale a n*log(n),
quindi, considerando che ho ogni volta migliaia di elementi in
ballo, fare ogni volta il sort e' improponibile.
ciao,
g.