Cómo utilizar la biblioteca de plantillas estándar std::sort()
para ordenar una matriz declarada como
int v[2000]
;
¿C ++ proporciona alguna función que pueda obtener el índice inicial y final de una matriz?
En C ++ 0x / 11 obtenemos std::begin
y std::end
cuáles están sobrecargados para matrices:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Si no tiene acceso a C ++ 0x, no es difícil escribirlos usted mismo:
// for container with nested typedefs, non-const version
template<class Cont>
typename Cont::iterator begin(Cont& c){
return c.begin();
}
template<class Cont>
typename Cont::iterator end(Cont& c){
return c.end();
}
// const version
template<class Cont>
typename Cont::const_iterator begin(Cont const& c){
return c.begin();
}
template<class Cont>
typename Cont::const_iterator end(Cont const& c){
return c.end();
}
// overloads for C style arrays
template<class T, std::size_t N>
T* begin(T (&arr)[N]){
return &arr[0];
}
template<class T, std::size_t N>
T* end(T (&arr)[N]){
return arr + N;
}
std::begin()
ystd::end()
C ++ 1x adiciones? Son muy agradables, debería haber sido así desde el principio, ¡habría hecho que muchos algoritmos fueran más genéricos!std::begin()
ystd::end()
no forman parte del estándar C ++ actual, pero puede usarboost::begin()
yboost::end()
.begin
yend
función en nuestros juegos de herramientas personales. Antes de C ++ 11, sin embargo, tenían una gran desventaja: no daban como resultado una expresión constante integral. Entonces, dependiendo de las necesidades específicas, las usaríamos, o una macro que hiciera la división de las dossizeof
.decltype
ciertamente simplifica ciertos usos, pero no veo qué tiene que ver con las funciones gratuitasbegin
yend
. (Y realmente debería tener dos de cada uno, uno para matrices de estilo C y otro para contenedores, con discriminación automática, para que pueda usarlos en plantillas, sin saber si el tipo es un contenedor o una matriz de estilo C.)#include <algorithm> static const size_t v_size = 2000; int v[v_size]; // Fill the array by values std::sort(v,v+v_size);
En C ++ 11 :
#include <algorithm> #include <array> std::array<int, 2000> v; // Fill the array by values std::sort(v.begin(),v.end());
fuente
std::vector
. Mi código sería:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Si no conoce el tamaño, puede usar:
std::sort(v, v + sizeof v / sizeof v[0]);
Incluso si conoce el tamaño, es una buena idea codificarlo de esta manera, ya que reducirá la posibilidad de un error si el tamaño de la matriz se cambia más tarde.
fuente
sizeof x/sizeof *x
truco, debe usar una plantilla más segura:,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
ya que fallará si en lugar de una matriz pasa un puntero. Se puede convertir en una constante de tiempo de compilación si es necesario, pero se vuelve un poco difícil de leer en un comentario.begin()
yend()
función de las plantillas que están especializados para todo tipo de contenedores comunes, incluyendo matrices, y utilizar en su lugar. La respuesta de Xeo me hizo pensar que estos ya se habían agregado a C ++, ahora parece que no ... Veré qué más tiene que decir la gente y luego actualizar.begin
,end
,size
,STATIC_SIZE
(macro que devuelve una constante de tiempo de compilación con el tamaño), pero para ser honesto, yo casi nunca utilizan que, fuera de pequeñas muestras de código.std::extent<decltype(v)>::value
en C ++ 11Puedes ordenarlo
std::sort(v, v + 2000)
fuente
//It is working #include<iostream> using namespace std; void main() { int a[5]; int temp=0; cout<<"Enter Values"<<endl; for(int i=0;i<5;i++) { cin>>a[i]; } for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { if(a[i]>a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } cout<<"Asending Series"<<endl; for(int i=0;i<5;i++) { cout<<endl; cout<<a[i]<<endl; } for(int i=0;i<5;i++) { for(int j=0;j<5;j++) { if(a[i]<a[j]) { temp=a[i]; a[i]=a[j]; a[j]=temp; } } } cout<<"Desnding Series"<<endl; for(int i=0;i<5;i++) { cout<<endl; cout<<a[i]<<endl; } }
fuente
puede usar sort () en C ++ STL. Sintaxis de la función sort ():
sort(array_name, array_name+size) So you use sort(v, v+2000);
fuente
Es tan simple como eso ... C ++ le proporciona una función en STL (Biblioteca de plantillas estándar) llamada
sort
que se ejecuta entre un 20% y un 50% más rápido que la clasificación rápida codificada a mano.Aquí está el código de muestra para su uso:
std::sort(arr, arr + size);
fuente
Clasificación de C ++ usando la función de clasificación
#include <bits/stdc++.h> using namespace std; vector <int> v[100]; int main() { sort(v.begin(), v.end()); }
fuente
std::sort(arr, arr + arr_size)
Utilice la
std::sort
función C ++ :#include <algorithm> using namespace std; int main() { vector<int> v(2000); sort(v.begin(), v.end()); }
fuente
//sort by number bool sortByStartNumber(Player &p1, Player &p2) { return p1.getStartNumber() < p2.getStartNumber(); } //sort by string bool sortByName(Player &p1, Player &p2) { string s1 = p1.getFullName(); string s2 = p2.getFullName(); return s1.compare(s2) == -1; }
fuente
Con la biblioteca Ranges que viene en C ++ 20, puede usar
directamente, donde
arr
hay una matriz incorporada.fuente
método de clasificación sin
std::sort
:// sorting myArray ascending int iTemp = 0; for (int i = 0; i < ARRAYSIZE; i++) { for (int j = i + 1; j <= ARRAYSIZE; j++) { // for descending sort change '<' with '>' if (myArray[j] < myArray[i]) { iTemp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = iTemp; } } }
Ejecute el ejemplo completo:
#include <iostream> // std::cout, std::endl /* http://en.cppreference.com/w/cpp/header/iostream */ #include <cstdlib> // srand(), rand() /* http://en.cppreference.com/w/cpp/header/cstdlib */ #include <ctime> // time() /* http://en.cppreference.com/w/cpp/header/ctime */ int main() { const int ARRAYSIZE = 10; int myArray[ARRAYSIZE]; // populate myArray with random numbers from 1 to 1000 srand(time(0)); for (int i = 0; i < ARRAYSIZE; i++) { myArray[i] = rand()% 1000 + 1; } // print unsorted myArray std::cout << "unsorted myArray: " << std::endl; for (int i = 0; i < ARRAYSIZE; i++) { std::cout << "[" << i << "] -> " << myArray[i] << std::endl; } std::cout << std::endl; // sorting myArray ascending int iTemp = 0; for (int i = 0; i < ARRAYSIZE; i++) { for (int j = i + 1; j <= ARRAYSIZE; j++) { // for descending sort change '<' with '>' if (myArray[j] < myArray[i]) { iTemp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = iTemp; } } } // print sorted myArray std::cout << "sorted myArray: " << std::endl; for (int i = 0; i < ARRAYSIZE; i++) { std::cout << "[" << i << "] -> " << myArray[i] << std::endl; } std::cout << std::endl; return 0; }
fuente
puedes usar,
std::sort(v.begin(),v.end());
fuente
begin
yend
. Debes estar pensando en avector
.