Approfondimento A1: algoritmi predefiniti nelle Standard Template Library
Contents
Approfondimento A1: algoritmi predefiniti nelle Standard Template Library¶
A1.1 Introduzione¶
insieme a strumenti per contenere informazioni, le STL offrono algoritmi per maneggiarle
due operazoni importanti per maneggiare contenitori sono la ricerca di un elemento al suo interno e l’ordinamento del suo contenuto
gli algoritmi diventano disponibili ** includendo l’header file
algorithm**

A1.2 std::find¶
il prototipo di questo algoritmo è il seguente:
template <class InputIterator, class T> InputIterator find (InputIterator first, InputIterator last, const T& val);
trova il primo elemento all’interno di un contenitore uguale a
val, nell’intervallo delimitato da due iteratori[first, last)per cercare su tutto un contenitore si passano come argomenti i suoi
begin ()edend ()
utilizza l’
operator==definito per il tipoTper la ricercadeve essere definito!

A1.2.1 il risultato di std::find¶
restituisce l’iteratore al primo elemento trovato uguale a
valse non trova nulla, restituisce l’iteratore alla fine del contenitore
vector<float> v ;
for (int i = 0 ; i < 10 ; ++i) v.push_back (0.5 * i) ;
vector<float>::iterator risultato =
find (v.begin (), v.end (), 3.5) ;
if (risultato != v.end ()) cout << "trovato " << *risultato << endl ;

A1.3 std::sort¶
esistono due prototipi per l’algoritmo di ordinamento
quello comunemente utilizzato funziona similmente a
find, perché agisce su un contenitore tramite i suoi iteratori:template <class RandomAccessIterator> void sort (RandomAccessIterator first, RandomAccessIterator last);
utilizza l’
operator<definito per il tipoTper ordinare in modo crescente il contenitoredeve essere definito!
per ordinare tutto un contenitore si passano come argomenti i suoi
begin ()edend ()

A1.3.1 risultato di std::sort¶
a partire da un
vectorriempito in questo modo:3, 2, 10, -1
la chiamata dell’algoritmo
sort:sort (v.begin (), v.end ()) ;
produce il seguente effetto sul contenuto del
vector:-1, 2, 3, 10

A1.3.2 la relazione di ordine nell’ordinamento¶
esiste un secondo prototipo di
sort, che permette di indicare la funzione da usare per ordinare il contenitoretemplate <class RandomAccessIterator, class Compare> void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp) ;
comppuò essere una funzione o una classenel caso sia una funzione, deve prendere in input (per copia o referenza) due argomenti del tipo contenuto nel contenitore e restituire in output un tipo compatibile con un
bool.nel caso sia una classe, deve contenere un
operator()che prenda in input (per copia o referenza) due argomenti del tipo contenuto nel contenitore e restituisca in output un tipo compatibile con unbool.

A1.4 un esempio di utilizzo¶
supponiamo di voler ordinare il vettore visto in precedenza anteponendo i numeri pari a quelli dispari. La funzione che deve sostituire la relazione di
<è:bool confronto (int i, int j) { if (i % 2 == 0) { if (j % 2 != 0) return true ; else return (i < j) ; } else { if (j % 2 == 0) return false ; else return (i < j) ; } }
In questo modo, la seguente chiamata:
sort (v.begin (), v.end (), confronto) ;
restituisce:
2, 10, -1, 3
