Jak używać biblioteki szablonów standardowych std::sort()
do sortowania tablicy zadeklarowanej jako
int v[2000]
;
Czy C ++ udostępnia jakąś funkcję, która może pobrać indeks początkowy i końcowy tablicy?
W C ++ 0x / 11 otrzymujemy std::begin
i std::end
które są przeciążone dla tablic:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Jeśli nie masz dostępu do C ++ 0x, nie jest trudno napisać je samemu:
// 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()
istd::end()
C ++ 1x dodatki? Są bardzo ładne - powinno tak być od samego początku, dzięki temu wiele algorytmów byłoby bardziej ogólnych!std::begin()
istd::end()
nie są częścią obecnego standardu C ++, ale możesz używaćboost::begin()
iboost::end()
.begin
iend
funkcję w naszych zestawów narzędziowych osobowych. Jednak przed C ++ 11 miały poważną wadę: nie dawały integralnego wyrażenia stałego. Więc w zależności od konkretnych potrzeb używalibyśmy ich lub makra, które dzieliło te dwa elementysizeof
.decltype
z pewnością upraszcza niektóre zastosowania, ale nie widzę, co to ma wspólnego z darmowymibegin
iend
funkcjami. (I naprawdę powinieneś mieć po dwie z nich, jedną dla tablic w stylu C, a drugą dla kontenerów, z automatycznym rozróżnianiem, więc możesz ich używać w szablonach, nie wiedząc, czy typ jest kontenerem, czy tablicą w stylu 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);
W C ++ 11 :
#include <algorithm> #include <array> std::array<int, 2000> v; // Fill the array by values std::sort(v.begin(),v.end());
źródło
std::vector
. Mój kod to:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Jeśli nie znasz rozmiaru, możesz użyć:
std::sort(v, v + sizeof v / sizeof v[0]);
Nawet jeśli znasz rozmiar, dobrym pomysłem jest zakodowanie go w ten sposób, ponieważ zmniejszy to możliwość wystąpienia błędu, jeśli rozmiar tablicy zostanie zmieniony później.
źródło
sizeof x/sizeof *x
sztuczki, powinieneś użyć bezpieczniejszego szablonu:,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
ponieważ to się nie powiedzie, jeśli zamiast tablicy przekażesz wskaźnik. W razie potrzeby można go przekształcić w stałą czasową kompilacji, ale w komentarzu staje się to trochę zbyt trudne.begin()
i wykorzystanieend()
szablonów, które są wyspecjalizowane dla wszystkich popularnych typów kontenerów, w tym tablic, i używanie ich zamiast tego. Odpowiedź Xeo sprawiła, że pomyślałem, że zostały one już dodane do C ++, teraz wygląda na to, że nie ... Zobaczę, co jeszcze ludzie mają do powiedzenia, a następnie zaktualizuję.begin
,end
,size
,STATIC_SIZE
(makro, które powraca stałym czasie kompilacji z rozmiarem), ale szczerze mówiąc, ja prawie nigdy nie używać, że poza małymi próbkami kodu.std::extent<decltype(v)>::value
Możesz to posortować
std::sort(v, v + 2000)
źródło
//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; } }
źródło
możesz użyć sort () w C ++ STL. sort () funkcja Składnia:
sort(array_name, array_name+size) So you use sort(v, v+2000);
źródło
To takie proste ... C ++ udostępnia funkcję w STL (Standard Template Library) o nazwie,
sort
która działa od 20% do 50% szybciej niż ręcznie kodowane szybkie sortowanie.Oto przykładowy kod do jego użycia:
std::sort(arr, arr + size);
źródło
Sortowanie w C ++ przy użyciu funkcji sortowania
#include <bits/stdc++.h> using namespace std; vector <int> v[100]; int main() { sort(v.begin(), v.end()); }
źródło
std::sort(arr, arr + arr_size)
Użyj funkcji C ++
std::sort
:#include <algorithm> using namespace std; int main() { vector<int> v(2000); sort(v.begin(), v.end()); }
źródło
//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; }
źródło
Dzięki bibliotece Ranges, która pojawi się w C ++ 20, możesz używać
bezpośrednio, gdzie
arr
jest tablicą wbudowaną.źródło
metoda sortowania bez
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; } } }
Uruchom pełny przykład:
#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; }
źródło
możesz użyć,
std::sort(v.begin(),v.end());
źródło
begin
iend
metod. Musisz myśleć ovector
.