Esempi: Lezione 5
Contents
Esempi: Lezione 5¶

5.0 esempio di overloading¶
/*
c++ -o main_00 main_00.cpp
*/
#include <iostream>
int somma (int a, int b)
{
return a + b ;
}
double somma (double a, double b)
{
return a + b ;
}
int main (int argc, char ** argv)
{
int i_a = 1 ;
int i_b = 2 ;
double d_a = 5. ;
double d_b = 7. ;
std::cout << "somma di interi " << somma (i_a, i_b) << std::endl ;
std::cout << "somma di razionali " << somma (d_a, d_b) << std::endl ;
return 0 ;
}

5.1 primo esempio di template¶
/*
c++ -o main_01 main_01.cpp
*/
#include <iostream>
template <typename T>
T somma (T a, T b)
{
return a + b ;
}
int main (int argc, char ** argv)
{
int i_a = 1 ;
int i_b = 2 ;
double d_a = 5. ;
double d_b = 7. ;
std::cout << "somma di interi " << somma (i_a, i_b) << std::endl ;
std::cout << "somma di interi " << somma<int> (i_a, i_b) << std::endl ;
std::cout << "somma di razionali " << somma<double> (i_a, i_b) << std::endl ;
std::cout << "somma di razionali " << somma (d_a, d_b) << std::endl ;
std::cout << "somma ibrida " << somma<double> (i_a, d_b) << std::endl ;
return 0 ;
}

5.2 esempio di funzione `template`
scritta in un file `.h`
¶
/*
c++ -o main_02 main_02.cpp
*/
#include <iostream>
#include "somma.h"
int main (int argc, char ** argv)
{
int i_a = 1 ;
int i_b = 2 ;
std::cout << "somma di interi " << somma (i_a, i_b) << std::endl ;
return 0 ;
}
#ifndef somma_h
#define somma_h
template <typename T>
T somma (T a, T b)
{
return a + b ;
}
#endif

5.3 esempio di classe `template`
¶
/*
c++ -o main_03 main_03.cpp
*/
#include <iostream>
#include "simpleArray.h"
int main (int argc, char ** argv)
{
SimpleArray<int> contenitore (atoi (argv[1])) ;
for (int i = 0 ; i < atoi (argv[1]) ; ++i)
{
contenitore[i] = 2 * i ;
}
for (int i = 0 ; i < atoi (argv[1]) ; ++i)
{
std::cout << i << "\t" << contenitore[i] << "\n" ;
}
return 0 ;
}
#ifndef simpleArray_h
#define simpleArray_h
template <class T>
class SimpleArray {
public:
// Costruttore
SimpleArray (const int & elementsNum):
elementsNum_p (elementsNum),
elements_p (new T [elementsNum])
{}
// Distruttore
~SimpleArray ()
{
delete [] elements_p ;
}
// Metodo che restituisce un elemento dell'array
T & element (const int& i)
{
if( i < elementsNum_p) return elements_p[i] ;
else return elements_p[elementsNum_p - 1] ;
}
// Overloading di operator[]
T & operator[] (const int& i)
{
if (i < elementsNum_p) return elements_p[i] ;
else return elements_p[elementsNum_p - 1] ;
}
private:
int elementsNum_p ;
T * elements_p ;
} ;
#endif

5.4 esempio di `template`
multipli¶
/*
c++ -o main_04 main_04.cpp
*/
#include <iostream>
template <typename T1, typename T2>
T2 somma (T1 a, T2 b)
{
return a + b ;
}
int main (int argc, char ** argv)
{
int i_a = 1 ;
double d_b = 2.1 ;
std::cout << "somma di interi " << somma (i_a, d_b) << std::endl ;
return 0 ;
}

5.5 esempio di specializzazione di un `template`
¶
/*
c++ -o main_05 main_05.cpp
*/
#include <iostream>
#include "somma.h"
template<>
float somma (float a, float b)
{
std::cout << "SOMMA DI FLOAT" << std::endl ;
return a + b ;
}
int main (int argc, char ** argv)
{
int i_a = 1 ;
int i_b = 2 ;
double d_a = 1 ;
double d_b = 2 ;
float f_a = 1 ;
float f_b = 2 ;
std::cout << "somma di interi " << somma (i_a, i_b) << std::endl ;
std::cout << "somma di double " << somma (d_a, d_b) << std::endl ;
std::cout << "somma di float " << somma (f_a, f_b) << std::endl ;
return 0 ;
}

5.6 esempio di una classe templata sul valore di una variabile¶
/*
c++ -o main_06 main_06.cpp
*/
#include <iostream>
#include <cmath>
#include "somma.h"
template <int N>
class vettore
{
public:
vettore ()
{
for (int i = 0 ; i < N ; ++i) elementi[i] = 0. ;
}
void setCoord (int i, double val)
{
if (i < 0 || i > N-1) return ;
elementi[i] = val ;
return ;
}
double norm ()
{
double sum = elementi[0] * elementi[0] ;
for (int i = 1 ; i < N ; ++i) sum += elementi[i] * elementi[i] ;
return sqrt (sum) ;
}
private:
float elementi[N] ;
} ;
int main (int argc, char ** argv)
{
vettore<2> v1 ;
v1.setCoord (0, 3.) ;
v1.setCoord (1, 4.) ;
std::cout << v1.norm () << std::endl ;
return 0 ;
}

5.7 esempio di un namespace¶
/*
c++ -o main_07 main_07.cpp
*/
#include <iostream>
// insieme di operazioni
namespace ops
{
template <typename T>
T somma (T a, T b)
{
return a + b ;
}
template<>
float somma (float a, float b)
{
std::cout << "SOMMA DI FLOAT" << std::endl ;
return a + b ;
}
template <typename T1, typename T2>
T2 somma (T1 a, T2 b)
{
return a + b ;
}
}
int main (int argc, char ** argv)
{
int i_a = 1 ;
int i_b = 2 ;
double d_a = 5. ;
double d_b = 7. ;
std::cout << "somma di interi " << ops::somma (i_a, i_b) << std::endl ;
std::cout << "somma di razionali " << ops::somma (d_a, d_b) << std::endl ;
return 0 ;
}

5.8 esempio di uso di un `vector`
¶
/*
c++ -o main_08 main_08.cpp
*/
#include <iostream>
#include <vector>
using namespace std ;
int main (int argc, char ** argv)
{
vector<double> v_1 ;
vector<double> v_2 (5, 1.1) ;
vector<double> v_3 (v_2) ;
cout << "elemento 1 di v_2 " << v_2[1] << endl ;
cout << "elemento 1 di v_2 " << v_2.at (1) << endl ;
cout << v_1.size () << endl ;
v_1.push_back (3.) ;
v_1.push_back (4.) ;
cout << v_1.size () << endl ;
v_1.pop_back () ;
cout << v_1.size () << endl ;
double * array_3 = & v_3.at (0) ;
cout << "elemento 2 di v_3 " << array_3[2] << endl ;
for (int i = 0 ; i < v_3.size () ; ++i)
cout << "elemento " << i << ": " << v_3.at (i) << "\n" ;
for (vector<double>::const_iterator it = v_3.begin () ;
it != v_3.end () ;
++it)
cout << "elemento " << it - v_3.begin () << ": " << *it << "\n" ;
return 0 ;
}

5.9 esempio di uso di una `map`
¶
/*
c++ -o main_09 main_09.cpp
*/
#include <iostream>
#include <map>
using namespace std ;
int main (int argc, char ** argv)
{
map <int, double> mappa_di_esempio ;
mappa_di_esempio[5] = 5.5 ;
mappa_di_esempio[3] = 3.3 ;
mappa_di_esempio[5] = 4.1 ;
mappa_di_esempio[12] = 7.9 ;
for (map<int, double>::const_iterator it = mappa_di_esempio.begin () ;
it != mappa_di_esempio.end () ;
++it)
{
cout << "elemento " << it->first
<< "\t-> " << it->second
<< endl ;
}
return 0 ;
}

5.10 esempio di uso di oggetti `string`
¶
/*
c++ -o main_10 main_10.cpp
*/
#include <iostream>
#include <string>
using namespace std ;
int main (int argc, char ** argv)
{
string s_1 ;
cout << s_1.length () << endl ;
s_1 = "nel mezzo del cammin" ;
cout << s_1 << endl ;
cout << s_1.length () << endl ;
string s_2 = " di nostra vita" ;
string s_3 = s_1 + s_2 ;
cout << s_3 << endl ;
string s_4 = "nostra" ;
int posizione = s_3.find (s_4) ;
cout << "La parola \"" << s_4
<< "\" inizia al carattere " << posizione
<< " della frase: \"" << s_3
<< "\"\n" ;
string s_5 = "caronte" ;
posizione = s_3.find (s_5) ;
cout << "La parola \"" << s_5
<< "\" inizia al carattere " << posizione
<< " della frase: \"" << s_3
<< "\"\n" ;
string s_6 = "caronte" ;
cout << (s_5 == s_3) << endl ;
char A = 'A' ;
cout << sizeof (A) << endl ;
string S = "A" ;
cout << sizeof (S) << endl ;
cout << sizeof (S.c_str ()) << endl ;
char * S_c = "A" ;
cout << sizeof (S_c) << endl ;
return 0 ;
}
