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?
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?
Jawaban:
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()
dan std::end()
bukan bagian dari Standar C ++ saat ini, tetapi Anda dapat menggunakan boost::begin()
dan boost::end()
.
begin
dan seperti itu end
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 keduanya sizeof
.
decltype
tentu saja menyederhanakan penggunaan tertentu, tetapi saya tidak melihat apa hubungannya dengan free begin
and end
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());
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.
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()
dan end()
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 ++ 11
Anda bisa mengurutkannya std::sort(v, v + 2000)
//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;
}
}
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);
Penyortiran C ++ menggunakan fungsi sortir
#include <bits/stdc++.h>
using namespace std;
vector <int> v[100];
int main()
{
sort(v.begin(), v.end());
}
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());
}
//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;
}
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;
}
kamu bisa memakai,
std::sort(v.begin(),v.end());
begin
dan end
metode. Anda pasti memikirkan a vector
.
std::begin()
danstd::end()
C ++ 1x tambahan? Mereka sangat bagus - seharusnya seperti ini sejak awal, itu akan membuat banyak algoritme menjadi lebih umum!