Pytanie Jak używać std :: sort do sortowania tablicy w C ++


Jak korzystać ze standardowej biblioteki szablonów std::sort() aby posortować tablicę zadeklarowaną jako int v[2000];

Czy C ++ udostępnia pewną funkcję, która może uzyskać indeks początkowy i końcowy tablicy?


76
2018-05-05 12:01


pochodzenie




Odpowiedzi:


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

92
2018-05-05 12:04



Są std::begin() i std::end() C ++ 1x dodatki? Są bardzo mili - tak powinno być od samego początku, dzięki temu wiele algorytmów stałoby się bardziej ogólne! - j_random_hacker
std::begin() i std::end() nie są częścią obecnego standardu C ++, ale można go użyć boost::begin() i boost::end(). - Kirill V. Lyadvinsky
Edytowano zgodnie z komentarzami. - Xeo
Przypomnienie: na długo przed zaproponowaniem C ++ 11 większość z nas miała takie begin i end funkcjonować w naszych osobistych zestawach narzędzi. Przed C ++ 11 mieli jednak wadę serios: nie otrzymali integralnego stałego wyrażenia. Tak więc, w zależności od konkretnych potrzeb, używalibyśmy ich lub makra, który dokonał podziału tych dwóch sizeof. - James Kanze
@Xeo Nie jestem pewien, czy rozumiem, co mówisz. decltype z pewnością upraszcza niektóre zastosowania, ale nie widzę, co to ma wspólnego z darmowymi begin i end Funkcje. (I tak naprawdę powinieneś mieć po dwie, jedną dla macierzy w stylu C, a drugą dla kontenerów, z automatyczną dyskryminacją, aby można było używać ich w szablonach, nie wiedząc, czy typ jest kontenerem, czy tablicą w stylu C.) - 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); 

W 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: Prawidłowo, ale bardzo krucho. Jeśli sortowanie nie jest bliskie deklaracji, można je łatwo zepsuć podczas konserwacji. - Martin York
@Martin: prawda. Dlatego wolę używać std::vector. Mój kod byłby: std::vector<int> v(2000); std::sort( v.begin(), v.end() ); - Naszta
Oczywiście używanie literalnych rozmiarów tablic jest zawsze niebezpieczne, jak w przykładzie. Ale nie ma nic złego w umieszczeniu rozmiaru tablicy w "const int". - Kai Petzke
Prawda, aktualizacja. :) - Naszta


Jeśli nie znasz rozmiaru, możesz użyć:

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

Nawet jeśli znasz rozmiar, dobrze jest go zakodować w ten sposób, ponieważ zmniejszy to prawdopodobieństwo błędu, jeśli rozmiar tablicy zostanie zmieniony później.


27
2018-05-05 12:04



Jeśli jest przydzielony statycznie, powinien znać rozmiar, ponieważ kompilator wie. Ale to jest lepsza praktyka kodowania. - Benoit
Ponieważ piszesz kod sprawdzający przyszłość, zamiast używać kodu sizeof x/sizeof *x podstęp, 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 przekazujesz wskaźnik. W razie potrzeby można go przekonwertować na stałą czasu kompilacji, ale staje się to trochę za trudne do odczytania w komentarzu. - David Rodríguez - dribeas
@David: Dobry pomysł, ale jeszcze lepszą (i odważę się powiedzieć prawą) jest zdefiniowanie begin() i end() szablony funkcji, które są wyspecjalizowane dla wszystkich popularnych typów kontenerów, w tym tablic i używają ich zamiast nich. Odpowiedź Xeo sprawiła, że ​​myślałem, że zostały już dodane do C ++, teraz wydaje się, że nie mają ... Zobaczę, co jeszcze inni mają do powiedzenia, a następnie zaktualizują. - j_random_hacker
:) Mam mały nagłówek narzędzia, który ma kilka takich bitów, w tym begin, end, size, STATIC_SIZE (makro zwracające stałą czasu kompilacji z rozmiarem), ale szczerze mówiąc, rzadko używam tego poza małymi próbkami kodu. - David Rodríguez - dribeas
Rozmiar tablicy może być odebrany przez std::extent<decltype(v)>::value w C ++ 11 - xis


Możesz to posortować std::sort(v, v + 2000)


15
2018-05-05 12:04



+1: Prawidłowo, ale bardzo krucho. Jeśli sortowanie nie jest bliskie deklaracji, można je łatwo zepsuć podczas konserwacji. - 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





możesz użyć sort () w C ++ STL. Funkcja sort () Składnia: 

 sort(array_name, array_name+size)      

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

3
2018-03-12 01:34





Sortowanie C ++ za pomocą funkcji sortowania

#include <bits/stdc++.h>
 using namespace std;

vector <int> v[100];

int main()
{
  sort(v.begin(), v.end());
}

2
2018-03-22 05:59



Ten działa na starszej wersji. Próbowałem z tym: std::sort(arr, arr + arr_size) - Code Cooker


To jest tak proste, jak ..... c ++ udostępnia wbudowaną funkcję w STL (Standard Template Library) sort(arr_name ,arr_name+arr_size) który działa od 20% do 50% szybciej niż zakodowany ręcznie kod szybkiego sortowania. Również lepiej umieść plik nagłówkowy

#include<bits/stdc++.h>

Oto przykładowy kod dla jego użycia:

#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





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

Biegać 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;
}

0
2018-03-05 07:22



Naprawdę? Chcesz użyć powolnego sortowania bąbelkowego zamiast standardowej biblioteki? Mało tego, masz jeden błąd, który powoduje UB. - Mark Ransom


Użyj C ++ std::sort funkcjonować:

#include <algorithm>
using namespace std;

int main()
{
  vector<int> v(2000);
  sort(v.begin(), v.end());
}

0
2018-03-22 15:38