सवाल सी ++ में सरणी को सॉर्ट करने के लिए std :: sort का उपयोग कैसे करें


मानक टेम्पलेट पुस्तकालय का उपयोग कैसे करें std::sort() के रूप में घोषित एक सरणी सॉर्ट करने के लिए int v[2000];

क्या सी ++ कुछ फ़ंक्शन प्रदान करता है जो किसी सरणी की शुरुआत और अंत अनुक्रमणिका प्राप्त कर सकता है?


76
2018-05-05 12:01


मूल




जवाब:


सी ++ 0x / 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;
}

92
2018-05-05 12:04



कर रहे हैं std::begin() तथा std::end() सी ++ 1 एक्स अतिरिक्त? वे बहुत अच्छे हैं - शुरुआत से इस तरह से होना चाहिए था, यह बहुत अधिक एल्गोरिदम अधिक सामान्य बना दिया होता! - j_random_hacker
std::begin() तथा std::end() वर्तमान सी ++ मानक का हिस्सा नहीं हैं, लेकिन आप इसका उपयोग कर सकते हैं boost::begin() तथा boost::end()। - Kirill V. Lyadvinsky
टिप्पणियों के अनुसार संपादित करें। - Xeo
बस एक अनुस्मारक: सी ++ 11 के लिए प्रस्तावित होने से बहुत पहले, हम में से अधिकांश ने ऐसा किया था begin तथा end हमारे व्यक्तिगत उपकरण किट में कार्य करें। सी ++ 11 से पहले, हालांकि, उनके पास एक सीरियो नुकसान था: उनका परिणाम अभिन्न निरंतर अभिव्यक्ति नहीं हुआ। तो विशिष्ट जरूरतों के आधार पर, हम उनका उपयोग करेंगे, या एक मैक्रो जो दोनों के विभाजन का था sizeof। - James Kanze
@Xeo मुझे यकीन नहीं है कि मैं समझ रहा हूं कि आप क्या कह रहे हैं। decltype निश्चित रूप से कुछ उपयोगों को सरल बनाता है, लेकिन मुझे नहीं लगता कि इसे मुफ्त में क्या करना है begin तथा end कार्य करता है। (और आप वास्तव में उनमें से प्रत्येक में से एक होना चाहिए, एक सी शैली सरणी के लिए, और दूसरा कंटेनरों के लिए, स्वचालित भेदभाव के साथ, ताकि आप टेम्पलेट्स में इसका उपयोग कर सकें, यह जानने के बिना कि प्रकार कंटेनर या सी स्टाइल सरणी है या नहीं।) - 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); 

में सी ++ 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: सही लेकिन बहुत भंगुर। अगर यह घोषणा घोषणा के नजदीक नहीं है तो इसे आसानी से रखरखाव के दौरान तोड़ दिया जा सकता है। - Martin York
@ मार्टिन: सच। यही कारण है कि मैं उपयोग करना पसंद करता हूं std::vector। मेरा कोड होगा: std::vector<int> v(2000); std::sort( v.begin(), v.end() ); - Naszta
बेशक, उदाहरण के रूप में, शाब्दिक सरणी आकार का उपयोग करना हमेशा खतरनाक होता है। लेकिन सरणी आकार को 'const int' में डालने में कुछ भी गलत नहीं है। - Kai Petzke
सच है, अद्यतन किया गया। :) - Naszta


यदि आप आकार नहीं जानते हैं, तो आप इसका उपयोग कर सकते हैं:

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

भले ही आप आकार को जानते हों, फिर भी इसे इस तरह से कोड करना एक अच्छा विचार है क्योंकि अगर सरणी आकार बाद में बदल जाता है तो यह बग की संभावना को कम कर देगा।


27
2018-05-05 12:04



यदि यह स्थिर रूप से आवंटित किया गया है, तो उसे आकार पता होना चाहिए, क्योंकि संकलक जानता है। लेकिन यह बेहतर कोडिंग अभ्यास है। - Benoit
चूंकि आप भविष्य के सबूत कोड लिख रहे हैं, इसका उपयोग करने के बजाय sizeof x/sizeof *x चाल आपको एक सुरक्षित टेम्पलेट का उपयोग करना चाहिए: template <typename T, int N> int array_size( T (&)[N] ) { return N; }, क्योंकि अगर आप एक सरणी के पास एक पॉइंटर पास करते हैं तो यह असफल हो जाएगा। यदि आवश्यक हो तो इसे संकलित समय निरंतर में परिवर्तित किया जा सकता है, लेकिन यह टिप्पणी में पढ़ने के लिए थोड़ा मुश्किल हो जाता है। - David Rodríguez - dribeas
@ डेविड: अच्छा विचार, लेकिन एक बेहतर (और मैं सही कहता हूं) तरीका परिभाषित करना है begin() तथा end()फ़ंक्शन टेम्पलेट्स जो सभी सामान्य कंटेनर प्रकारों के लिए विशेष हैं, जिनमें सरणी शामिल हैं, और इसके बजाय उनका उपयोग करें। ज़ीओ के जवाब ने मुझे यह सोचा कि ये पहले से ही सी ++ में जोड़ा गया है, अब ऐसा लगता है कि वे नहीं हैं ... मैं देखता हूं कि लोगों को क्या कहना है और फिर अपडेट करना है। - j_random_hacker
:) मेरे पास एक छोटा उपयोगिता हैडर है जिसमें इस तरह के कुछ बिट्स शामिल हैं begin, end, size, STATIC_SIZE (मैक्रो जो आकार के साथ एक संकलन समय स्थिर करता है), लेकिन ईमानदार होने के लिए, मैं शायद ही कभी छोटे कोड नमूने के बाहर इसका उपयोग करता हूं। - David Rodríguez - dribeas
एक सरणी का आकार प्राप्त किया जा सकता है std::extent<decltype(v)>::value सी ++ 11 में - xis


आप इसे सॉर्ट कर सकते हैं std::sort(v, v + 2000)


15
2018-05-05 12:04



+1: सही लेकिन बहुत भंगुर। अगर यह घोषणा घोषणा के नजदीक नहीं है तो इसे आसानी से रखरखाव के दौरान तोड़ दिया जा सकता है। - 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





आप सी ++ एसटीएल में सॉर्ट () का उपयोग कर सकते हैं। सॉर्ट () फ़ंक्शन सिंटेक्स: 

 sort(array_name, array_name+size)      

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

3
2018-03-12 01:34





सॉर्ट फ़ंक्शन का उपयोग करके सी ++ सॉर्टिंग

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

vector <int> v[100];

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

2
2018-03-22 05:59



यह पुराने संस्करण पर काम करता है। मैंने इसके साथ प्रयास किया: std::sort(arr, arr + arr_size) - Code Cooker


यह उतना आसान है जितना कि ..... c ++ आपको एसटीएल (मानक टेम्पलेट लाइब्रेरी) नामक एक अंतर्निहित कार्य प्रदान कर रहा है sort(arr_name ,arr_name+arr_size) जो हाथ से कोडित त्वरित-क्रम से 20% से 50% तेज चलता है। इसके अलावा आप हेडर फ़ाइल को बेहतर तरीके से शामिल करते हैं

#include<bits/stdc++.h>

इसके उपयोग के लिए नमूना कोड यहां दिया गया है:

#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