Câu hỏi Làm thế nào để sử dụng std :: sắp xếp để sắp xếp một mảng trong C ++


Cách sử dụng thư viện mẫu chuẩn std::sort() để sắp xếp một mảng được khai báo là int v[2000];

Có C + + cung cấp một số chức năng có thể nhận được chỉ số bắt đầu và kết thúc của một mảng?


76
2018-05-05 12:01


gốc




Các câu trả lời:


Trong C ++ 0x / 11, chúng ta nhận được std::begin và std::end bị quá tải cho mảng:

#include <algorithm>

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

Nếu bạn không có quyền truy cập vào C ++ 0x, không khó để tự viết chúng:

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



Là std::begin() và std::end() C ++ 1x bổ sung? Họ rất tốt đẹp - nên đã được theo cách này ngay từ đầu, nó sẽ có nhiều thuật toán chung chung hơn! - j_random_hacker
std::begin() và std::end() không phải là một phần của tiêu chuẩn C ++ hiện tại, nhưng bạn có thể sử dụng boost::begin() và boost::end(). - Kirill V. Lyadvinsky
Đã chỉnh sửa cho phù hợp với các ý kiến. - Xeo
Chỉ là một lời nhắc nhở: lâu trước khi họ được đề xuất cho C ++ 11, hầu hết chúng ta đều có một begin và end chức năng trong bộ công cụ cá nhân của chúng tôi. Tuy nhiên, trước C ++ 11, chúng có nhược điểm về serios: chúng không dẫn đến một biểu thức không đổi. Vì vậy, tùy thuộc vào nhu cầu cụ thể, chúng tôi sẽ sử dụng chúng hoặc macro đã phân chia hai sizeof. - James Kanze
@ Xeo Tôi không chắc tôi hiểu những gì bạn đang nói. decltype chắc chắn đơn giản hóa việc sử dụng nhất định, nhưng tôi không thấy những gì nó phải làm với miễn phí begin và end chức năng. (Và bạn thực sự cần có hai cái, một cho mảng kiểu C và một cho vùng chứa, với phân biệt đối xử tự động, vì vậy bạn có thể sử dụng chúng trong mẫu, mà không biết loại đó là vùng chứa hay mảng kiểu 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); 

Trong 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: Đúng nhưng rất giòn. Nếu sắp xếp không gần tờ khai, điều này có thể dễ dàng bị hỏng trong quá trình bảo trì. - Martin York
@ Martin: đúng. Đó là lý do tại sao tôi thích sử dụng std::vector. Mã của tôi sẽ là: std::vector<int> v(2000); std::sort( v.begin(), v.end() ); - Naszta
Tất nhiên, sử dụng các kích thước mảng chữ luôn luôn nguy hiểm, như trong ví dụ. Nhưng không có gì sai khi đặt kích thước mảng vào một 'const int'. - Kai Petzke
Đúng, cập nhật. :) - Naszta


Nếu bạn không biết kích thước, bạn có thể sử dụng:

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

Ngay cả khi bạn biết kích thước, bạn nên viết mã theo cách này vì nó sẽ giảm khả năng xảy ra lỗi nếu kích thước mảng bị thay đổi sau đó.


27
2018-05-05 12:04



Nếu nó được phân bổ tĩnh, anh ta nên biết kích thước, bởi vì trình biên dịch biết. Nhưng đây là thực hành mã hóa tốt hơn. - Benoit
Vì bạn đang viết mã bằng chứng trong tương lai, thay vì sử dụng sizeof x/sizeof *x lừa bạn nên sử dụng một mẫu an toàn hơn: template <typename T, int N> int array_size( T (&)[N] ) { return N; }, như vậy sẽ thất bại nếu thay vì một mảng bạn vượt qua một con trỏ. Nó có thể được chuyển đổi thành một hằng số thời gian biên dịch nếu cần thiết, nhưng nó sẽ trở thành một chút quá khó để đọc trong một bình luận. - David Rodríguez - dribeas
@ David: Ý tưởng hay, nhưng cách tốt hơn (và tôi dám nói The Right) là xác định begin() và end() các mẫu chức năng dành riêng cho tất cả các loại vùng chứa chung, bao gồm mảng và sử dụng chúng. Câu trả lời của Xeo khiến tôi nghĩ rằng những thứ này đã được thêm vào C ++, bây giờ có vẻ như họ chưa ... Tôi sẽ thấy những gì người khác phải nói và sau đó cập nhật. - j_random_hacker
:) Tôi có một tiêu đề tiện ích nhỏ có một vài bit như thế này, bao gồm begin, end, size, STATIC_SIZE (macro trả về một hằng số thời gian biên dịch với kích thước), nhưng thành thật mà nói, tôi hầu như không bao giờ sử dụng nó ngoài các mẫu mã nhỏ. - David Rodríguez - dribeas
Kích thước của một mảng có thể được nhận bởi std::extent<decltype(v)>::value trong C ++ 11 - xis


Bạn có thể sắp xếp nó std::sort(v, v + 2000)


15
2018-05-05 12:04



+1: Đúng nhưng rất giòn. Nếu sắp xếp không gần tờ khai, điều này có thể dễ dàng bị hỏng trong quá trình bảo trì. - 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





bạn có thể sử dụng sort () trong C ++ STL. Hàm sort () Cú pháp: 

 sort(array_name, array_name+size)      

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

3
2018-03-12 01:34





Phân loại C ++ sử dụng chức năng sắp xếp

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

vector <int> v[100];

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

2
2018-03-22 05:59



Điều này hoạt động trên phiên bản cũ hơn. Tôi đã thử với điều này: std::sort(arr, arr + arr_size) - Code Cooker


Nó đơn giản như vậy ..... c ++ đang cung cấp cho bạn một hàm dựng sẵn trong STL (Thư viện mẫu chuẩn) được gọi là sort(arr_name ,arr_name+arr_size) chạy nhanh hơn 20% đến 50% so với sắp xếp nhanh bằng tay. Ngoài ra bạn tốt hơn bao gồm các tập tin tiêu đề

#include<bits/stdc++.h>

Đây là mã mẫu cho việc sử dụng nó:

#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





phương pháp sắp xếp mà không có 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;
        }
    }
}

Chạy ví dụ hoàn chỉnh:

#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



Có thật không? Bạn muốn sử dụng một loại bong bóng chậm thay vì thư viện chuẩn? Không chỉ vậy, bạn có một lỗi off-by-one gây ra UB. - Mark Ransom


Sử dụng C ++ std::sort chức năng:

#include <algorithm>
using namespace std;

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

0
2018-03-22 15:38





bạn có thể dùng,

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

-1
2018-02-02 05:55



Xin chào, câu hỏi này dường như có một câu trả lời được chấp nhận rộng rãi. Bạn có thể giải thích cách này khác nhau không? - Stefan
Mảng không có begin và end phương pháp. Bạn phải nghĩ đến một vector. - Mark Ransom