Soru C ++'da bir diziyi sıralamak için std :: sort nasıl kullanılır


Standart şablon kütüphanesi nasıl kullanılır? std::sort() olarak bildirilen bir diziyi sıralamak için int v[2000];

C ++ bir dizinin başlangıç ​​ve bitiş dizinini alabilen bazı işlevler sağlıyor mu?


76
2018-05-05 12:01


Menşei




Cevaplar:


C ++ 0x / 11'de aldık std::begin ve std::end diziler için aşırı yüklenmiştir:

#include <algorithm>

int main(){
  int v[2000];
  std::sort(std::begin(v), std::end(v));
}

C ++ 0x'ye 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;
}

92
2018-05-05 12:04



Are std::begin() ve std::end() C ++ 1x eklemeler? Çok güzeller - en baştan bu şekilde olmalılar, çok daha fazla algoritma yapmışlardı! - j_random_hacker
std::begin() ve std::end() Geçerli C ++ Standardının bir parçası değil, ancak kullanabilirsiniz boost::begin() ve boost::end(). - Kirill V. Lyadvinsky
Yorumlara göre düzenlenmiştir. - Xeo
Sadece bir hatırlatma: C ++ 11 için önerilmeden çok önce, çoğumuz böyle bir begin ve end Kişisel araç kitlerimizde işlev görür. Ancak C ++ 11'den önce, bir serios dezavantajı vardı: Bütünleyici bir sabit ifade ile sonuçlanmadılar. Dolayısıyla, belirli ihtiyaçlara bağlı olarak, bunları kullanırız, ya da iki bölümün bölünmesini yapan bir makroyu kullanırız. sizeof. - James Kanze
@Xeo Ne söylediğini anlayamadığımdan emin değilim. decltype kesinlikle belirli kullanımları kolaylaştırır, ancak ücretsiz olarak ne yapması gerektiğini göremiyorum begin ve end fonksiyonlar. (Ve gerçekten her biri iki, biri C stili diziler için, diğeri ise otomatik ayrımcılığa sahip, kapsayıcılar için başka bir tane olmalıdır, bu nedenle bunları şablonda kapsayıcı mı yoksa bir C stili dizisi mi olduğunu bilmeden kullanabilirsiniz.) - James Kanze


#include <algorithm>
static const size_t v_size = 2000;
int v[v_size];
// Fill the array by values
std::sort(v,v+v_size); 

İçinde C ++ 11:

#include <algorithm>
#include <array>
std::array<int, 2000> v;
// Fill the array by values
std::sort(v.begin(),v.end()); 

61
2018-05-05 12:02



+1: Doğru ama çok kırılgan. Sıralama beyanın yakınında değilse, bu bakım sırasında kolayca kırılabilir. - Martin York
@Martin: doğru. Bu yüzden kullanmayı tercih ederim std::vector. Kodum şöyle olurdu: std::vector<int> v(2000); std::sort( v.begin(), v.end() ); - Naszta
Elbette, literal dizi boyutlarını kullanmak örnekte olduğu gibi her zaman tehlikelidir. Ancak dizi boyutunu 'const int' içine koymakla ilgili bir sorun yoktur. - Kai Petzke
Doğru, güncel. :) - Naszta


Boyutu bilmiyorsanız şunları kullanabilirsiniz:

std::sort(v, v + sizeof v / sizeof v[0]);

Boyutu biliyorsanız bile, dizi boyutunu daha sonra değiştirirseniz bir hata olasılığını azaltacak şekilde bu şekilde kodlamak iyi bir fikirdir.


27
2018-05-05 12:04



Statik olarak ayrılmışsa, derleyicinin bildiği için boyutu bilmelidir. Ancak bu daha iyi kodlama uygulamasıdır. - Benoit
Gelecek kanıt kodunu yazdığınız için sizeof x/sizeof *x hile daha güvenli bir şablon kullanmalısınız: template <typename T, int N> int array_size( T (&)[N] ) { return N; }Bir dizi yerine bir işaretçi geçirirseniz başarısız olur. Gerekirse bir derleme zamanı sabitine dönüştürülebilir, ancak bir yorumda okunması biraz zorlaşır. - David Rodríguez - dribeas
@David: İyi fikir, ama daha da iyi (ve doğru söyleyememe) yolu tanımlamaktır begin() ve end()Diziler de dahil olmak üzere tüm yaygın konteyner türleri için özelleştirilmiş işlev şablonları ve bunun yerine bunları kullanın. Xeo'nun cevabı, bunların zaten C ++ 'ya eklendiğini düşünmemi sağladı, şimdi görmedikleri görünüyor ... İnsanların başka ne söyleyeceğini görüp daha sonra güncelleyeceğim. - j_random_hacker
:) Ben de dahil olmak üzere birkaç bit olan küçük bir yardımcı program üstbilgisi var begin, end, size, STATIC_SIZE (bir derleme zaman sabitini boyut ile döndüren makro), ancak dürüst olmak gerekirse, neredeyse hiç küçük kod örneklerinin dışında kullanırım. - David Rodríguez - dribeas
Bir dizinin boyutu tarafından alınabilir std::extent<decltype(v)>::value C ++ 11'de - xis


Onu sıralayabilirsiniz std::sort(v, v + 2000)


15
2018-05-05 12:04



+1: Doğru ama çok kırılgan. Sıralama beyanın yakınında değilse, bu bakım sırasında kolayca kırılabilir. - Martin York


//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;
    }


}

3
2017-08-10 05:39





C ++ STL'de sort () öğesini kullanabilirsiniz. sort () işlevi Sözdizimi: 

 sort(array_name, array_name+size)      

 So you use  sort(v, v+2000);

3
2018-03-12 01:34





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());
}

2
2018-03-22 05:59



Bu eski sürümde çalışır. Bununla çalıştım: std::sort(arr, arr + arr_size) - Code Cooker


Bu kadar basittir ..... c ++ size STL (Standart Şablon Kütüphanesi) denilen yerleşik bir işlev sunar sort(arr_name ,arr_name+arr_size) Bu, el ile kodlanmış hızlı sıralamadan% 20 ila% 50 daha hızlı çalışır. Ayrıca üstbilgi dosyasını dahil ederseniz

#include<bits/stdc++.h>

İşte kullanım için örnek kod:

#include<isostream>
#include<bits/stdc++.h>
using namespace std;
main()
{
    int n;cin>>n;
    int a[n];
    for(int i=0;i<n;i++)
        cin>>a[i];
    sort(a,a+n);
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
}

2
2018-05-08 16:52





sıralama metodu olmadan 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;
        }
    }
}

Koşmak tam örnek:

#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;
}

0
2018-03-05 07:22



Gerçekten mi? Standart kitaplık yerine yavaş bir kabarcık türü kullanmak ister misiniz? Sadece bu değil, UB'ye neden olan birebir hata var. - Mark Ransom