Bagaimana menggunakan pustaka template standar std::sort()
untuk mengurutkan array yang dideklarasikan sebagai
int v[2000]
;
Apakah C ++ menyediakan beberapa fungsi yang bisa mendapatkan indeks awal dan akhir dari sebuah array?
Di C ++ 0x / 11 kita mendapatkan std::begin
dan std::end
yang kelebihan beban untuk array:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
Jika Anda tidak memiliki akses ke C ++ 0x, tidak sulit untuk menulisnya sendiri:
// 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()
danstd::end()
C ++ 1x tambahan? Mereka sangat bagus - seharusnya seperti ini sejak awal, itu akan membuat banyak algoritme menjadi lebih umum!std::begin()
danstd::end()
bukan bagian dari Standar C ++ saat ini, tetapi Anda dapat menggunakanboost::begin()
danboost::end()
.begin
dan seperti ituend
di kit alat pribadi kita. Sebelum C ++ 11, bagaimanapun, mereka memiliki kelemahan serios: mereka tidak menghasilkan ekspresi konstan yang tidak terpisahkan. Jadi tergantung pada kebutuhan spesifik, kami akan menggunakannya, atau makro yang melakukan pembagian keduanyasizeof
.decltype
tentu saja menyederhanakan penggunaan tertentu, tetapi saya tidak melihat apa hubungannya dengan freebegin
andend
functions. (Dan Anda benar-benar harus memiliki dua di antaranya, satu untuk larik gaya C, dan satu lagi untuk penampung, dengan diskriminasi otomatis, sehingga Anda dapat menggunakannya dalam templat, tanpa mengetahui apakah tipenya adalah penampung atau larik gaya 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);
Di C ++ 11 :
#include <algorithm> #include <array> std::array<int, 2000> v; // Fill the array by values std::sort(v.begin(),v.end());
sumber
std::vector
. Kode saya adalah:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Jika Anda tidak mengetahui ukurannya, Anda dapat menggunakan:
std::sort(v, v + sizeof v / sizeof v[0]);
Bahkan jika Anda mengetahui ukurannya, ada baiknya untuk mengkodekannya dengan cara ini karena akan mengurangi kemungkinan bug jika ukuran array diubah nanti.
sumber
sizeof x/sizeof *x
trik, Anda harus menggunakan templat yang lebih aman:,template <typename T, int N> int array_size( T (&)[N] ) { return N; }
karena itu akan gagal jika alih-alih larik Anda meneruskan penunjuk. Ini dapat diubah menjadi konstanta waktu kompilasi jika diperlukan, tetapi menjadi agak terlalu sulit untuk dibaca dalam komentar.begin()
danend()
menjalankan template yang dikhususkan untuk semua jenis wadah umum, termasuk array, dan menggunakannya sebagai gantinya. Jawaban Xeo membuat saya berpikir ini telah ditambahkan ke C ++, sekarang sepertinya belum ... Saya akan melihat apa lagi yang orang katakan dan kemudian perbarui.begin
,end
,size
,STATIC_SIZE
(makro yang kembali kompilasi waktu yang konstan dengan ukuran), tapi jujur, saya hampir tidak pernah menggunakan di luar contoh kode kecil.std::extent<decltype(v)>::value
dalam C ++ 11Anda bisa mengurutkannya
std::sort(v, v + 2000)
sumber
//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; } }
sumber
Anda dapat menggunakan sort () di C ++ STL. sort () function Sintaks:
sort(array_name, array_name+size) So you use sort(v, v+2000);
sumber
Ini sesederhana itu ... C ++ menyediakan Anda sebuah fungsi dalam STL (Standard Template Library) yang disebut
sort
yang berjalan 20% hingga 50% lebih cepat daripada quick-sort yang dikodekan dengan tangan.Berikut adalah contoh kode penggunaannya:
std::sort(arr, arr + size);
sumber
Penyortiran C ++ menggunakan fungsi sortir
#include <bits/stdc++.h> using namespace std; vector <int> v[100]; int main() { sort(v.begin(), v.end()); }
sumber
std::sort(arr, arr + arr_size)
Gunakan fungsi C ++
std::sort
:#include <algorithm> using namespace std; int main() { vector<int> v(2000); sort(v.begin(), v.end()); }
sumber
//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; }
sumber
Dengan perpustakaan Ranges yang datang dalam C ++ 20, Anda dapat menggunakan
secara langsung, di mana
arr
array bawaan.sumber
metode penyortiran tanpa
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; } } }
Jalankan contoh lengkap:
#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; }
sumber
kamu bisa memakai,
std::sort(v.begin(),v.end());
sumber
begin
danend
metode. Anda pasti memikirkan avector
.