std :: sort를 사용하여 C ++에서 배열을 정렬하는 방법


91

표준 템플릿 라이브러리를 사용 std::sort()하여 다음과 같이 선언 된 배열을 정렬하는 방법 int v[2000];

C ++는 배열의 시작 및 끝 인덱스를 가져올 수있는 일부 함수를 제공합니까?

답변:


111

C에서 + +0 / 11 우리가 도착 std::begin하고 std::end있는이 배열에 대한 과부하 :

#include <algorithm>

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

C ++ 0x에 액세스 할 수없는 경우 직접 작성하는 것이 어렵지 않습니다.

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

12
인가 std::begin()std::end()C ++ 1X 추가? 그것들은 매우 훌륭합니다. 처음부터 이런 식 이었어 야했고, 많은 알고리즘을보다 포괄적으로 만들었을 것입니다!
j_random_hacker

10
std::begin()그리고 std::end()현재의 C ++ 표준의 일부가 아닌,하지만 당신은 사용할 수 있습니다 boost::begin()boost::end().
Kirill V. Lyadvinsky 2011

1
댓글에 따라 수정되었습니다.
Xeo

2
그냥 알림 : 그들은 C ++ (11)에 대한 제안을했다 오래 전에는, 우리 대부분은 같은했다 beginend우리의 개인적인 도구 키트에 기능을. 그러나 C ++ 11 이전에는 몇 가지 단점이있었습니다. 즉, 정수 상수 표현식이 생성되지 않았습니다. 따라서 특정 요구 사항에 따라 두 가지를 나누는 매크로를 사용합니다 sizeof.
James Kanze

1
@Xeo 나는 당신이 말하는 것을 이해하지 못합니다. decltype확실히 특정 사용을 단순화하지만 무료 beginend기능 과 어떤 관련이 있는지 모르겠습니다 . (그리고 자동 식별 기능이있는 C 스타일 배열과 컨테이너에 각각 하나씩 두 개씩 있어야합니다. 그러면 유형이 컨테이너인지 C 스타일 배열인지 알지 못해도 템플릿에서 사용할 수 있습니다.)
제임스 간제

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

에서 C ++ 11 :

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

5
+1 : 정확하지만 매우 부서지기 쉽습니다. 정렬이 선언 근처에 있지 않으면 유지 관리 중에 쉽게 깨질 수 있습니다.
Martin York

1
@Martin : 사실. 그래서 std::vector. 내 코드는 다음과 같습니다.std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Naszta 2011

2
물론, 리터럴 배열 크기를 사용하는 것은 예제에서와 같이 항상 위험합니다. 그러나 배열 크기를 'const int'에 넣는 것은 잘못된 것이 아닙니다.
Kai Petzke 2013 년

31

크기를 모르는 경우 다음을 사용할 수 있습니다.

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

크기를 알고 있더라도 나중에 배열 크기가 변경 될 경우 버그 가능성을 줄일 수 있으므로 이렇게 코딩하는 것이 좋습니다.


3
정적으로 할당 된 경우 컴파일러가 알고 있기 때문에 크기를 알아야합니다. 그러나 이것은 더 나은 코딩 방법입니다.
Benoit

7
미래의 증명 코드를 작성하고 있기 때문에 sizeof x/sizeof *x트릭을 사용하는 대신 더 안전한 템플릿을 사용해야합니다 template <typename T, int N> int array_size( T (&)[N] ) { return N; }. 배열 대신 포인터를 전달하면 실패합니다. 필요한 경우 컴파일 시간 상수로 변환 할 수 있지만 주석에서 읽기가 너무 어려워집니다.
David Rodríguez-dribeas

1
@David : 좋은 생각이지만 더 나은 방법은 배열을 포함하여 모든 일반적인 컨테이너 유형에 특화된 템플릿 을 정의 begin()하고 end()기능하고 대신 사용하는 것입니다. Xeo의 대답은 이것들이 이미 C ++에 추가되었다고 생각하도록 만들었습니다. 이제는 그렇지 않은 것 같습니다. 다른 사람들이 무엇을 말해야하는지보고 업데이트 할 것입니다.
j_random_hacker

1
:) 내가 포함하여이 같은 몇 비트가 작은 유틸리티 헤더가 begin, end, size, STATIC_SIZE,하지만 솔직히 말해서, 나는 좀처럼 작은 코드 샘플의 외부를 사용하지 (반환 크기의 컴파일 시간 상수는 것을 매크로).
David Rodríguez-dribeas

1
배열의 크기는 std::extent<decltype(v)>::valueC ++ 11에서 받을 수 있습니다
xis

18

정렬 할 수 있습니다. std::sort(v, v + 2000)


4
+1 : 정확하지만 매우 부서지기 쉽습니다. 정렬이 선언 근처에 있지 않으면 유지 관리 중에 쉽게 깨질 수 있습니다.
Martin York

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


}

2

C ++ STL에서 sort ()를 사용할 수 있습니다. sort () 함수 구문 :

 sort(array_name, array_name+size)      

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

2

그것은 간단합니다 ... C ++는 STL (Standard Template Library)에서 호출되는 기능을 제공합니다. sort 는 직접 코딩 한 빠른 정렬보다 20 %에서 50 % 더 빠르게 실행됩니다.

다음은 사용에 대한 샘플 코드입니다.

std::sort(arr, arr + size);

1

정렬 함수를 사용한 C ++ 정렬

#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 ++가 아니라는 말은 아닙니다.
LF


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

Stack Overflow에 오신 것을 환영합니다. 설명없이 코드 만 제공하는 답변은 일반적으로 눈살을 찌푸립니다. 특히 a) 이미 제공된 답변이 많고 b) 답변이 이미 수락 된 경우 더욱 그렇습니다. 귀하의 솔루션이 이미 게시 된 12 개 솔루션과 다르거 나 더 나은 이유를 설명해주십시오.
chb

1

C ++ 20에서 제공되는 Ranges 라이브러리를 사용하면 다음을 사용할 수 있습니다.

ranges::sort(arr);

직접, 어디에 arr내장 배열입니다.


0

없는 정렬 방법 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;
        }
    }
}

전체 예제 실행 :

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

1
정말? 표준 라이브러리 대신 느린 버블 정렬을 사용 하시겠습니까? 뿐만 아니라 UB를 유발하는 단일 오류가 있습니다.
Mark Ransom

-1

당신이 사용할 수있는,

 std::sort(v.begin(),v.end());

안녕하세요,이 질문은 이미 널리 받아 들여진 답변을 가지고있는 것 같습니다. 이것이 어떻게 다른지 설명해 주시겠습니까?
Stefan

배열에는 beginend메서드 가 없습니다 . 당신은 vector.
Mark Ransom
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.