Algoritmos de la STL / C++17

Ordenar, invertir y quitar duplicados

Llevar al apunte ↗

Descripción

Ordenar reúne los elementos según un criterio. Puede facilitar buscar extremos, agrupar valores iguales o recorrer datos de menor a mayor. sort modifica el rango recibido, así que ordená una copia si después necesitás la secuencia original.

El orden por defecto es ascendente. En pares compara primero .first y después .second. Un comparador propio permite cambiar prioridades y desempates. Debe expresar si el primer elemento va estrictamente antes que el segundo.

reverse invierte el orden que hay en ese momento. unique junta las repeticiones contiguas y devuelve un nuevo final lógico. Para eliminar todas las repeticiones por valor, primero ordená y después ajustá el tamaño con erase.

Funciones y operaciones

Uso Parámetros Resultado o efecto
sort(inicio, fin) Rango Ordena de menor a mayor
sort(inicio, fin, comparador) Rango y función Ordena según si a debe ir antes que b
reverse(inicio, fin) Rango Invierte la secuencia
unique(inicio, fin) Rango Compacta iguales contiguos y devuelve el nuevo fin
v.erase(nuevoFin, v.end()) Fin lógico y fin anterior Ajusta el tamaño después de compactar

Ejemplos

Ordenar una copia

vector<int> original = {5, 2, 5, 1};
vector<int> ordenado = original;
sort(ordenado.begin(), ordenado.end());
// ordenado queda {1, 2, 5, 5}; original conserva su orden.

Orden descendente

vector<int> v = {5, 2, 5, 1};
sort(v.begin(), v.end(), [](int a, int b) {
    return a > b;
});
// v queda {5, 5, 2, 1}

Comparar pares con un desempate

vector<pair<int, int>> datos = {{2, 5}, {1, 3}, {1, 8}};
sort(datos.begin(), datos.end(), [](const auto& a, const auto& b) {
    if (a.first != b.first) return a.first < b.first;
    return a.second > b.second;
});
// datos queda {{1, 8}, {1, 3}, {2, 5}}

Un elemento debe compararse como falso consigo mismo. Usá comparaciones estrictas < o > y un desempate consistente.

Invertir texto

string s = "TAP";
reverse(s.begin(), s.end()); // "PAT"

Conservar valores distintos en un vector

vector<int> v = {3, 1, 3, 2, 1};
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
// v queda {1, 2, 3}

sort cuesta O(n log n). Invertir y compactar cuestan O(n). Esta forma de quitar repetidos deja los valores ordenados.