//Código de las páginas 433-435

#include <vector>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std ;

template <class T> void muestra(const vector <T> &l) {
    // implementación en la página 376
}

void main() {				   
    int c1[] = {10,2,30,43,15,15,30,80,19,100};
    int c3[] = {14,3,23,43,150,15,32,81,20,110};
    int t1,t2;

    t1=sizeof(c1)/sizeof(int);
    t2=sizeof(c3)/sizeof(int);

    vector <int> v1(c1,c1+t1),v2(c1,c1+t1),
	              v3(c3,c3+t2),v4(t1+t2);

    cout<<"Valores de v1";
    muestra(v1);

    // Ordena los elementos del vector de menor a mayor
    sort(v1.begin(),v1.end());
    cout << "Valores de v1 después de ordenar";
    muestra(v1);

    // Se especifica la función de ordenación,
	 // en ese caso de mayor a menor
    sort(v1.begin(),v1.end(),greater<int>());
    cout << "Valores de v1 después de ordenar de mayor a menor";
    muestra(v1);
    
    cout << "Valores de v2";
    muestra(v2);
	
    // busca 43 en el vector. Como el vector no está ordenado 
     // no lo encuentra
    if (binary_search(v2.begin(),v2.end(),43))
      cout << "No está ordenado el vector."
        " Se encuentra el elemento 43\n";
    else 
      cout << "No está ordenado el vector. "
        " No se encuentra el elemento 43\n";
	
    // ordenando los elementos menores a 43
    nth_element(v2.begin(),v2.begin()+3,v2.end());
    cout << "Valores de v2 después de la ordenación hasta 43";
    muestra(v2);
    // busca 43 en el vector. Está ordenado
    if (binary_search(v2.begin(),v2.end(),43))
      cout << "Está ordenado el vector. "
             "Se encuentra el elemento 43\n";
    else 
      cout << "Está ordenadro el vector."
				" No se encuentra el elemento  43\n";

    sort(v1.begin(),v1.end());
    sort(v3.begin(),v3.end());
    // mezcla ordenada de v1 y v3
    merge(v1.begin(),v1.end(),v3.begin(),v3.end(),v4.begin());
    cout << "Valores de v1";
    muestra(v1);
    cout << "Valores de v3";
    muestra(v3);
    cout << "Valores de v4. Mezcla ordenada de v1 y v3";
    muestra(v4);
}
