/*  
  Scrivere una funzione che, dato un vettore in ingresso contenente
  valori interi (dunque sia positivi che negativi o nulli), restituisca
  un nuovo vettore contenente le sole componenti negative, nello stesso
  ordine.

 Ad esempio, se il vettore passato contiene:
 11 -22 4 -3 18 -1

 la funzione deve restituire il vettore 
 -22 -3 -1
 
*********************************************************/

#include <iostream>
using namespace std;

void componenti_negative(int* v_in, int lun_in, int* &v_out, int & lun_out) {

   lun_out = 0; // lunghezza del vettore di uscita

   // calcolo il numero di componenti negative
   for (int i = 0; i < lun_in; i++)
	   if ( v_in[i] < 0 )
		   lun_out++;

    v_out = new int[lun_out];  // alloco nello Heap un nuovo vettore, della dimensione opportuna

	int h = 0;
	for (int i = 0; i < lun_in; i++) {
		if ( v_in[i] < 0 ) {
			v_out[h] = v_in[i];
			h++;
		}
	}			

	return;
}



int main(){
   
   const int DIM = 6;
   int vett[] = {11, -22, 4, -3, 18, -1};

   cout << "Vettore di partenza (con componenti sia positive che negative):" << endl;
   for (int i = 0; i < DIM; i++)
	   cout << vett[i] << ' ';

   int* nuovoVett = NULL;
   int nuovaDIM; // variabile non inizializzata. Provvedera' la funzione componenti negative
                 // ad assegnargli un valore significativo

   // priva della chiamata della componenti_negative nuovoVett e' un puntatore nullo (ossia vale 0),
   // mentre dopo la chiamata conterra' un indirizzo (quello restituito dall'operatore 'new')
   componenti_negative( vett, DIM, nuovoVett, nuovaDIM );

   cout << "Ecco il nuovo vettore (solo componenti negative): " << endl; 

   for (int i = 0; i < nuovaDIM; i++)
      cout << nuovoVett[i] << ' ';
   
   cout<<endl<<"Ora che non mi serve piu', posso deallocarlo dallo Heap"<<endl;
   delete[] nuovoVett;

   return 0;
}
