11 septiembre 2023

Ordenando vectores

Hace unos días les mostré como "revolver" el contenido en un vector en C++ (después de haber explicado, hace mucho, como usar vectores y luego iteradores), pero para otro problema tenía que ordenar un vector.

Encontré esta página que lo explica muy bien, y luego lo apliqué a un ejemplo práctico que ordena un vector que tiene datos de diferente tipo. De esta manera pueden ver cómo funciona el método sort con mis propias funciones de comparación.

Te aconsejo de leer el post que explica el sort y aquí te dejo mi código de ejemplo:


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
/* ***
 * Ordena.cpp - Ejemplifica como usar el sort en vectores
 * ***/
 
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

class Prueba {
	public:
		int datoEntero;
		float datoFlotante;
		string datoString;
		Prueba();		//	 Constructor default
		Prueba(int,float,string);	// Constructor sobrecargado
		string MuestraDatos();
};

// Constructor default
Prueba::Prueba() {
	datoEntero = 0;
	datoFlotante = 0.0f;
	datoString = "";
}

// Constructor sobrecargado
Prueba::Prueba(int entero,float numDecimal,string texto) {
	datoEntero = entero;
	datoFlotante = numDecimal;
	datoString = texto;
}

// Devuelve una cadena con los valores en el objeto
// Salida: una cadena con los valores
string Prueba::MuestraDatos(){
	string x = to_string(datoEntero).append(" - ").append(to_string(datoFlotante)).append(" - ").append(datoString);
	return x;
}

// Función para comparar (usado en el sort)
bool compara1(Prueba a,Prueba b) {
	return a.datoEntero < b.datoEntero;
}

bool compara2(Prueba a,Prueba b) {
	return a.datoFlotante < b.datoFlotante;
}

bool compara3(Prueba a,Prueba b) {
	// compareTo devuelve un número, hagoa la expdresión para que devuelva
	// True o False.
	return (a.datoString.compare(b.datoString) < 0);
}

int main () {
	// Declarar el vector
	vector<Prueba> lista;
	// Lleno el vector con datos
	lista.push_back(Prueba(1,2.0f,"primero"));
	lista.push_back(Prueba(7,2.5f,"segundo"));
	lista.push_back(Prueba(4,4.5f,"tercero"));
	lista.push_back(Prueba(3,6.33f,"cuarto"));
	lista.push_back(Prueba(5,1.8f,"quinto"));
	lista.push_back(Prueba(2,8.45f,"sexto"));
	
	// Muestro el contenido del vector
	cout << "Lista de elementos\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
	
	// Ordeno la lista usando mi función para comparar
	// y muestro la lista ordenada
	sort(lista.begin(),lista.end(),compara1);
	cout << "Lista de elementos ordenados por el dato entero\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
	
	// Ordeno la lista de nuevo usando mis otras funciones
	// para comparar y muestro las listas resultantes
	sort(lista.begin(),lista.end(),compara2);
	cout << "Lista de elementos ordenados por el dato flotante\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
	sort(lista.begin(),lista.end(),compara3);
	cout << "Lista de elementos ordenados por el texto\n";
	for (Prueba xx : lista) {
		cout << xx.MuestraDatos() << endl;
	}
}

Espero que te sea útil. ¡Hasta la próxima!

No hay comentarios.:

El Tony y sus ondas...

Related Posts Plugin for WordPress, Blogger...