C++
Clasificación
Buscar..
Observaciones
La familia de funciones std::sort
se encuentra en la biblioteca de algorithm
.
Clasificación de contenedores de secuencia con orden específico
Si los valores en un contenedor ya tienen ciertos operadores sobrecargados, std::sort
puede usarse con funtores especializados para ordenar en orden ascendente o descendente:
#include <vector>
#include <algorithm>
#include <functional>
std::vector<int> v = {5,1,2,4,3};
//sort in ascending order (1,2,3,4,5)
std::sort(v.begin(), v.end(), std::less<int>());
// Or just:
std::sort(v.begin(), v.end());
//sort in descending order (5,4,3,2,1)
std::sort(v.begin(), v.end(), std::greater<int>());
//Or just:
std::sort(v.rbegin(), v.rend());
En C ++ 14, no necesitamos proporcionar el argumento de plantilla para los objetos de la función de comparación y, en su lugar, dejar que el objeto deduzca en función de lo que se pasa:
std::sort(v.begin(), v.end(), std::less<>()); // ascending order
std::sort(v.begin(), v.end(), std::greater<>()); // descending order
Clasificación de contenedores de secuencia por sobrecargado menos operador
Si no se pasa ninguna función de ordenación, std::sort
ordenará los elementos llamando al operator<
en pares de elementos, que deben devolver un tipo convertible contextualmente a bool
(o simplemente bool
). Los tipos básicos (enteros, flotadores, punteros, etc.) ya se han construido en los operadores de comparación.
Podemos sobrecargar a este operador para que la llamada de sort
predeterminada funcione en tipos definidos por el usuario.
// Include sequence containers
#include <vector>
#include <deque>
#include <list>
// Insert sorting algorithm
#include <algorithm>
class Base {
public:
// Constructor that set variable to the value of v
Base(int v): variable(v) {
}
// Use variable to provide total order operator less
//`this` always represents the left-hand side of the compare.
bool operator<(const Base &b) const {
return this->variable < b.variable;
}
int variable;
};
int main() {
std::vector <Base> vector;
std::deque <Base> deque;
std::list <Base> list;
// Create 2 elements to sort
Base a(10);
Base b(5);
// Insert them into backs of containers
vector.push_back(a);
vector.push_back(b);
deque.push_back(a);
deque.push_back(b);
list.push_back(a);
list.push_back(b);
// Now sort data using operator<(const Base &b) function
std::sort(vector.begin(), vector.end());
std::sort(deque.begin(), deque.end());
// List must be sorted differently due to its design
list.sort();
return 0;
}
Clasificación de contenedores de secuencia utilizando la función de comparación
// Include sequence containers
#include <vector>
#include <deque>
#include <list>
// Insert sorting algorithm
#include <algorithm>
class Base {
public:
// Constructor that set variable to the value of v
Base(int v): variable(v) {
}
int variable;
};
bool compare(const Base &a, const Base &b) {
return a.variable < b.variable;
}
int main() {
std::vector <Base> vector;
std::deque <Base> deque;
std::list <Base> list;
// Create 2 elements to sort
Base a(10);
Base b(5);
// Insert them into backs of containers
vector.push_back(a);
vector.push_back(b);
deque.push_back(a);
deque.push_back(b);
list.push_back(a);
list.push_back(b);
// Now sort data using comparing function
std::sort(vector.begin(), vector.end(), compare);
std::sort(deque.begin(), deque.end(), compare);
list.sort(compare);
return 0;
}
Ordenando los contenedores de secuencias usando expresiones lambda (C ++ 11)
// Include sequence containers
#include <vector>
#include <deque>
#include <list>
#include <array>
#include <forward_list>
// Include sorting algorithm
#include <algorithm>
class Base {
public:
// Constructor that set variable to the value of v
Base(int v): variable(v) {
}
int variable;
};
int main() {
// Create 2 elements to sort
Base a(10);
Base b(5);
// We're using C++11, so let's use initializer lists to insert items.
std::vector <Base> vector = {a, b};
std::deque <Base> deque = {a, b};
std::list <Base> list = {a, b};
std::array <Base, 2> array = {a, b};
std::forward_list<Base> flist = {a, b};
// We can sort data using an inline lambda expression
std::sort(std::begin(vector), std::end(vector),
[](const Base &a, const Base &b) { return a.variable < b.variable;});
// We can also pass a lambda object as the comparator
// and reuse the lambda multiple times
auto compare = [](const Base &a, const Base &b) {
return a.variable < b.variable;};
std::sort(std::begin(deque), std::end(deque), compare);
std::sort(std::begin(array), std::end(array), compare);
list.sort(compare);
flist.sort(compare);
return 0;
}
Clasificación y secuenciación de contenedores.
std::sort
, que se encuentra en el algorithm
encabezado de biblioteca estándar, es un algoritmo de biblioteca estándar para ordenar un rango de valores, definido por un par de iteradores. std::sort
toma como último parámetro un funtor utilizado para comparar dos valores; Así es como determina el orden. Tenga en cuenta que std::sort
no es estable .
La función de comparación debe imponer un ordenamiento estricto y débil en los elementos. Una simple comparación menor que (o mayor que) será suficiente.
Un contenedor con iteradores de acceso aleatorio se puede ordenar utilizando el algoritmo std::sort
:
#include <vector>
#include <algorithm>
std::vector<int> MyVector = {3, 1, 2}
//Default comparison of <
std::sort(MyVector.begin(), MyVector.end());
std::sort
requiere que sus iteradores sean iteradores de acceso aleatorio. Los contenedores de secuencias std::list
y std::forward_list
(que requieren C ++ 11) no proporcionan iteradores de acceso aleatorio, por lo que no pueden usarse con std::sort
. Sin embargo, tienen funciones de miembro de sort
que implementan un algoritmo de clasificación que funciona con sus propios tipos de iteradores.
#include <list>
#include <algorithm>
std::list<int> MyList = {3, 1, 2}
//Default comparison of <
//Whole list only.
MyList.sort();
Sus funciones de sort
miembros siempre ordenan la lista completa, por lo que no pueden ordenar un sub-rango de elementos. Sin embargo, dado que list
y forward_list
tienen operaciones de empalme rápidas, puede extraer los elementos que se ordenarán de la lista, ordenarlos y luego volver a guardarlos donde fueron más eficientemente así:
void sort_sublist(std::list<int>& mylist, std::list<int>::const_iterator start, std::list<int>::const_iterator end) {
//extract and sort half-open sub range denoted by start and end iterator
std::list<int> tmp;
tmp.splice(tmp.begin(), list, start, end);
tmp.sort();
//re-insert range at the point we extracted it from
list.splice(end, tmp);
}
clasificación con std :: map (ascendente y descendente)
Este ejemplo ordena los elementos en orden ascendente de una clave utilizando un mapa. Puede usar cualquier tipo, incluida la clase, en lugar de std::string
, en el siguiente ejemplo.
#include <iostream>
#include <utility>
#include <map>
int main()
{
std::map<double, std::string> sorted_map;
// Sort the names of the planets according to their size
sorted_map.insert(std::make_pair(0.3829, "Mercury"));
sorted_map.insert(std::make_pair(0.9499, "Venus"));
sorted_map.insert(std::make_pair(1, "Earth"));
sorted_map.insert(std::make_pair(0.532, "Mars"));
sorted_map.insert(std::make_pair(10.97, "Jupiter"));
sorted_map.insert(std::make_pair(9.14, "Saturn"));
sorted_map.insert(std::make_pair(3.981, "Uranus"));
sorted_map.insert(std::make_pair(3.865, "Neptune"));
for (auto const& entry: sorted_map)
{
std::cout << entry.second << " (" << entry.first << " of Earth's radius)" << '\n';
}
}
Salida:
Mercury (0.3829 of Earth's radius)
Mars (0.532 of Earth's radius)
Venus (0.9499 of Earth's radius)
Earth (1 of Earth's radius)
Neptune (3.865 of Earth's radius)
Uranus (3.981 of Earth's radius)
Saturn (9.14 of Earth's radius)
Jupiter (10.97 of Earth's radius)
Si son posibles entradas con claves iguales, use el multimap
lugar del map
(como en el siguiente ejemplo).
Para ordenar los elementos de forma descendente , declare el mapa con un funtor de comparación adecuado ( std::greater<>
):
#include <iostream>
#include <utility>
#include <map>
int main()
{
std::multimap<int, std::string, std::greater<int>> sorted_map;
// Sort the names of animals in descending order of the number of legs
sorted_map.insert(std::make_pair(6, "bug"));
sorted_map.insert(std::make_pair(4, "cat"));
sorted_map.insert(std::make_pair(100, "centipede"));
sorted_map.insert(std::make_pair(2, "chicken"));
sorted_map.insert(std::make_pair(0, "fish"));
sorted_map.insert(std::make_pair(4, "horse"));
sorted_map.insert(std::make_pair(8, "spider"));
for (auto const& entry: sorted_map)
{
std::cout << entry.second << " (has " << entry.first << " legs)" << '\n';
}
}
Salida
centipede (has 100 legs)
spider (has 8 legs)
bug (has 6 legs)
cat (has 4 legs)
horse (has 4 legs)
chicken (has 2 legs)
fish (has 0 legs)
Clasificación de matrices incorporadas
El algoritmo de sort
ordena una secuencia definida por dos iteradores. Esto es suficiente para ordenar una matriz integrada (también conocida como c-style).
int arr1[] = {36, 24, 42, 60, 59};
// sort numbers in ascending order
sort(std::begin(arr1), std::end(arr1));
// sort numbers in descending order
sort(std::begin(arr1), std::end(arr1), std::greater<int>());
Antes de C ++ 11, el final de la matriz debía "calcularse" utilizando el tamaño de la matriz:
// Use a hard-coded number for array size
sort(arr1, arr1 + 5);
// Alternatively, use an expression
const size_t arr1_size = sizeof(arr1) / sizeof(*arr1);
sort(arr1, arr1 + arr1_size);