Esempi: Lezione 5

../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png

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
../_images/linea.png

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
../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png

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 ;
  }
../_images/linea.png