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


91

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

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

जवाबों:


111

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

12
हैं std::begin()और std::end()C ++ 1x जोड़? वे बहुत अच्छे हैं - शुरू से ही इस तरह से होना चाहिए था, यह बहुत सारे एल्गोरिदम को अधिक सामान्य बना देता था!
j_random_hacker

10
std::begin()और std::end()वर्तमान C ++ मानक का हिस्सा नहीं हैं, लेकिन आप उपयोग कर सकते हैं boost::begin()और boost::end()
किरिल वी। ल्याडविंस्की

1
टिप्पणियों के अनुसार संपादित किया गया।
Xeo

2
बस एक अनुस्मारक: लंबे समय से पहले वे सी ++ 11 के लिए प्रस्तावित किए गए थे, हम में से अधिकांश के पास हमारे व्यक्तिगत टूल किट में ऐसा beginऔर endफ़ंक्शन था। C ++ 11 से पहले, हालांकि, उन्हें एक सीरियस नुकसान था: वे एक अभिन्न निरंतर अभिव्यक्ति में परिणाम नहीं हुए। इसलिए विशिष्ट आवश्यकताओं के आधार पर, हम उनका उपयोग करेंगे, या एक मैक्रो जो दोनों का विभाजन किया था sizeof
जेम्स कांज़े

1
@ Xeo मुझे यकीन नहीं है कि मैं समझता हूं कि आप क्या कह रहे हैं। decltypeनिश्चित रूप से कुछ उपयोगों को सरल करता है, लेकिन मैं यह नहीं देखता कि इसे मुफ्त beginऔर endकार्यों के साथ क्या करना है । (और आपको वास्तव में उनमें से प्रत्येक दो होना चाहिए, सी शैली सरणियों के लिए एक, और कंटेनरों के लिए एक और, स्वचालित भेदभाव के साथ, इसलिए आप उन्हें टेम्पलेट में उपयोग कर सकते हैं, बिना यह जाने कि प्रकार एक कंटेनर है या सी शैली सरणी।)
जेम्स कांजे

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

में सी ++ 11 :

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

5
+1: सही लेकिन बहुत भंगुर। अगर छंटनी घोषणा के पास नहीं है तो रखरखाव के दौरान इसे आसानी से तोड़ा जा सकता है।
मार्टिन

1
@ मार्टिन: सच। इसलिए मैं उपयोग करना पसंद करता हूं std::vector। मेरा कोड होगा:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
Naszta

2
बेशक, शाब्दिक सरणी आकारों का उपयोग करना हमेशा खतरनाक होता है, उदाहरण के लिए। लेकिन ऐरे साइज को 'कॉन्स्टेंट इंट' में डालने में कुछ भी गलत नहीं है।
काई पेट्ज़के

31

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

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

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


3
यदि यह सांख्यिकीय रूप से आवंटित किया गया है, तो उसे आकार पता होना चाहिए, क्योंकि संकलक जानता है। लेकिन यह बेहतर कोडिंग अभ्यास है।
बेनोइट

7
चूंकि आप भविष्य के प्रूफ कोड लिख रहे हैं, इसलिए sizeof x/sizeof *xट्रिक का उपयोग करने के बजाय आपको एक सुरक्षित टेम्पलेट का उपयोग करना चाहिए: template <typename T, int N> int array_size( T (&)[N] ) { return N; }जैसे कि यदि आप एक पॉइंटर पास करते हैं तो एक सरणी के बजाय यह विफल हो जाएगा। जरूरत पड़ने पर इसे एक संकलन समय में परिवर्तित किया जा सकता है, लेकिन यह एक टिप्पणी में पढ़ना थोड़ा कठिन हो जाता है।
डेविड रोड्रिज -

1
@ डेविड: अच्छा विचार है, लेकिन इससे भी बेहतर (और मैं कहता हूं कि हिम्मत) सही तरीका परिभाषित करना begin()और end()फ़ंक्शन टेम्प्लेट है जो सभी सामान्य कंटेनर प्रकारों के लिए विशिष्ट हैं, जिसमें सरणियाँ शामिल हैं, और इसके बजाय उनका उपयोग करें। Xeo के जवाब से मुझे लगा कि ये पहले ही C ++ में जुड़ चुके हैं, अब ऐसा लगता है कि उन्होंने ऐसा नहीं किया है ... मैं देखूंगा कि लोगों को क्या कहना है और फिर अपडेट करना होगा।
j_random_hacker

1
:) मैं एक छोटे उपयोगिता हैडर सहित इस, जैसे कुछ बिट्स है कि है begin, end, size, STATIC_SIZE(मैक्रो रिटर्न आकार के साथ एक संकलन समय निरंतर), लेकिन ईमानदारी से, मैं शायद ही कभी छोटे कोड नमूनों की है कि बाहर का उपयोग करें।
डेविड रोड्रिगेज -

1
एक सरणी का आकार std::extent<decltype(v)>::valueC ++ 11
xis

18

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


4
+1: सही लेकिन बहुत भंगुर। अगर छंटनी घोषणा के पास नहीं है तो रखरखाव के दौरान इसे आसानी से तोड़ा जा सकता है।
मार्टिन

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(array_name, array_name+size)      

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

2

यह उतना ही सरल है ... C ++ आपको STL (स्टैंडर्ड टेम्प्लेट लाइब्रेरी) में एक फ़ंक्शन प्रदान कर 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;
}

ढेर अतिप्रवाह में आपका स्वागत है। ऐसे उत्तर जो बिना किसी स्पष्टीकरण के केवल कोड प्रदान करते हैं, आमतौर पर उन पर ध्यान केंद्रित किया जाता है, खासकर जब क) पहले से प्रदान किए गए कई उत्तर हैं, और ख) एक उत्तर पहले ही स्वीकार किया जा चुका है। कृपया विस्तृत रूप से बताएं कि आपके समाधान पहले से पोस्ट किए गए 12 से अलग और / या बेहतर क्यों हैं।
चब १

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
वास्तव में? आप मानक पुस्तकालय के बजाय धीमी गति से बुलबुला सॉर्ट का उपयोग करना चाहते हैं? इतना ही नहीं, आपके पास यूबी के कारण एक-एक त्रुटि है।
मार्क रैनसम

-1

आप उपयोग कर सकते हैं,

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

नमस्ते, इस सवाल का पहले से ही व्यापक रूप से स्वीकृत जवाब है। क्या आप बता सकते हैं कि यह कैसे अलग है?
स्टीफन

Arrays नहीं है beginऔर endतरीके हैं। आप एक के बारे में सोच होना चाहिए vector
मार्क रैनसम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.