std::sort()
Olarak bildirilen bir diziyi sıralamak için
standart şablon kitaplığı nasıl kullanılır int v[2000]
;
C ++, bir dizinin başlangıç ve bitiş dizinini alabilen bir işlev sağlar mı?
std::sort()
Olarak bildirilen bir diziyi sıralamak için
standart şablon kitaplığı nasıl kullanılır int v[2000]
;
C ++, bir dizinin başlangıç ve bitiş dizinini alabilen bir işlev sağlar mı?
Yanıtlar:
C ++ 0x / 11 elde ederiz std::begin
ve std::end
hangi diziler için aşırı yüklü:
#include <algorithm>
int main(){
int v[2000];
std::sort(std::begin(v), std::end(v));
}
C ++ 0x'e erişiminiz yoksa, bunları kendiniz yazmak zor değildir:
// 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()
ve std::end()
mevcut C ++ Standardının bir parçası değildir, ancak boost::begin()
ve kullanabilirsiniz boost::end()
.
begin
ve end
bizim kişisel bir araç kitleri işlevini kullanın. Bununla birlikte, C ++ 11'den önce, ciddi bir dezavantajları vardı: integral sabit bir ifadeyle sonuçlanmıyorlardı. Bu nedenle, belirli ihtiyaçlara bağlı olarak, onları veya ikisini bölen bir makro kullanırdık sizeof
.
decltype
kesinlikle belirli kullanımları basitleştirir, ancak ücretsiz begin
ve end
işlevlerle ne ilgisi olduğunu anlamıyorum . (Ve bunlardan biri C stili diziler ve diğeri konteynerler için olmak üzere ikisine sahip olmalısınız, otomatik ayrımcılık sayesinde, türünün bir kap mı yoksa C stili bir dizi mi olduğunu bilmeden bunları şablonlarda kullanabilirsiniz.)
#include <algorithm>
static const size_t v_size = 2000;
int v[v_size];
// Fill the array by values
std::sort(v,v+v_size);
Gelen C ++ 11 :
#include <algorithm>
#include <array>
std::array<int, 2000> v;
// Fill the array by values
std::sort(v.begin(),v.end());
std::vector
. std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Boyutu bilmiyorsanız şunları kullanabilirsiniz:
std::sort(v, v + sizeof v / sizeof v[0]);
Boyutu bilseniz bile, dizinin boyutu daha sonra değiştirilirse hata olasılığını azaltacağı için bu şekilde kodlamak iyi bir fikirdir.
sizeof x/sizeof *x
hile kullanmak yerine daha güvenli bir şablon kullanmalısınız: template <typename T, int N> int array_size( T (&)[N] ) { return N; }
çünkü bir dizi yerine bir işaretçi iletirseniz bu başarısız olur. Gerekirse bir derleme zaman sabitine dönüştürülebilir, ancak bir yorumda okumak biraz fazla zorlaşır.
begin()
ve end()
fonksiyon diziler dahil tüm ortak konteyner türleri için uzman şablonlar ve bunun yerine bunları kullanın. Xeo'nun cevabı, bunların C ++ 'ya zaten eklendiğini düşündürdü, şimdi öyle görünüyor ... İnsanların başka ne söyleyeceklerine bakacağım ve sonra güncelleyeceğim.
begin
, end
, size
, STATIC_SIZE
, ama dürüst olmak gerekirse, ben neredeyse hiç küçük kod örnekleri o dışını kullanma (döner boyutu ile bir derleme zamanı sabiti olduğu makro).
std::extent<decltype(v)>::value
C ++ 11
Sıralayabilirsin 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;
}
}
sort () C ++ STL'de kullanabilirsiniz. sort () işlevi Sözdizimi:
sort(array_name, array_name+size)
So you use sort(v, v+2000);
Bu kadar basit ... C ++ size STL (Standart Şablon Kitaplığı) adı verilen sort
ve elle kodlanmış hızlı sıralamadan% 20 ila% 50 daha hızlı çalışan bir işlev sağlıyor .
İşte kullanımı için örnek kod:
std::sort(arr, arr + size);
Sıralama işlevini kullanarak C ++ sıralama
#include <bits/stdc++.h>
using namespace std;
vector <int> v[100];
int main()
{
sort(v.begin(), v.end());
}
std::sort(arr, arr + arr_size)
C ++ std::sort
işlevini kullanın :
#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;
}
olmadan sıralama yöntemi 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;
}
}
}
Tam örnek çalıştırın :
#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;
}
kullanabilirsiniz,
std::sort(v.begin(),v.end());
begin
ve end
yöntemleri yoktur. Bir vector
.
std::begin()
vestd::end()
C ++ 1x eklemeler? Çok iyiler - en başından beri bu şekilde olmalıydı, birçok algoritmayı daha genel hale getirebilirdi!