C ++ এ অ্যারে বাছাই করতে std :: সাজানোর পদ্ধতিটি কীভাবে ব্যবহার করবেন


91

std::sort()ঘোষিত অ্যারে বাছাই করতে কীভাবে স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরি ব্যবহার করবেন int v[2000];

সি ++ এমন কোনও ফাংশন সরবরাহ করে যা কোনও অ্যারের সূচনা এবং শেষ সূচক পেতে পারে?

উত্তর:


111

সি ++ 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()সি ++ 1x সংযোজন? তারা খুব সুন্দর - শুরু থেকেই এইভাবে হওয়া উচিত ছিল, এটি প্রচুর পরিমাণে অ্যালগোরিদমকে আরও জেনেরিক করে তুলত!
j_random_hacker

10
std::begin()এবং std::end()বর্তমান সি ++ স্ট্যান্ডার্ডের একটি অংশ নয়, তবে আপনি boost::begin()এবং ব্যবহার করতে পারেন boost::end()
কিরিল ভি লিয়াডভিনস্কি

4
মন্তব্য অনুসারে সম্পাদিত।
Xoo

4
কেবলমাত্র একটি অনুস্মারক: তারা সি ++ 11 এর জন্য প্রস্তাবিত হওয়ার অনেক আগে, আমাদের বেশিরভাগেরই আমাদের ব্যক্তিগত সরঞ্জাম সরঞ্জামগুলিতে এরকম একটি beginএবং endকার্যকারিতা ছিল। সি ++ 11 এর আগে অবশ্য তাদের সিরিসের অসুবিধা ছিল: তারা অবিচ্ছেদ্য ধ্রুবক প্রকাশের ফলস্বরূপ ঘটেনি। সুতরাং নির্দিষ্ট প্রয়োজনীয়তার উপর নির্ভর করে আমরা সেগুলি ব্যবহার করব বা একটি ম্যাক্রো যা দুটির বিভাজন করেছিল sizeof
জেমস কানজে

4
@ শিও আমি নিশ্চিত না আপনি কী বলছেন তা আমি বুঝতে পেরেছি। decltypeঅবশ্যই কিছু ব্যবহার সহজতর করে, তবে ফ্রি beginএবং endফাংশনগুলির সাথে এটির কী কী আছে তা আমি দেখতে পাচ্ছি না । (এবং আপনার সত্যিকারের দু'জনের দুটি হওয়া উচিত, একটি সি স্টাইল অ্যারেগুলির জন্য এবং অন্যটি পাত্রে স্বয়ংক্রিয় বৈষম্য সহ, যাতে আপনি এগুলি টেমপ্লেটগুলিতে ব্যবহার করতে পারেন, প্রকারটি কোনও ধারক বা সি স্টাইল অ্যারে কিনা তা জেনেও without)
জেমস কানজে 5'11

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

4
+1: সঠিক তবে খুব ভঙ্গুর। বাছাই ঘোষণার কাছাকাছি না থাকলে রক্ষণাবেক্ষণের সময় এটি সহজেই ভেঙে যেতে পারে।
মার্টিন ইয়র্ক

4
@ মার্টিন: সত্য। যে কারণে আমি ব্যবহার করতে পছন্দ করি std::vector। আমার কোডটি হবে:std::vector<int> v(2000); std::sort( v.begin(), v.end() );
নাস্ত্তা

4
উদাহরণস্বরূপ, আক্ষরিক অ্যারে মাপগুলি ব্যবহার করা সর্বদা বিপজ্জনক। তবে অ্যারের আকারটিকে 'কনস্ট্যান্ট ইন্টি' তে রাখার ক্ষেত্রে কোনও ভুল নেই।
কাই পেটজেকে

31

আপনি যদি আকারটি না জানেন তবে আপনি এটি ব্যবহার করতে পারেন:

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

আপনি যদি আকারটি জানেন তবেও এটিকে কোড করা ভাল ধারণা কারণ এটি পরে অ্যারের আকার পরিবর্তন করা হলে বাগের সম্ভাবনা হ্রাস করবে reduce


4
যদি এটি স্থিতিশীলভাবে বরাদ্দ করা হয় তবে তার আকারটি জানা উচিত, কারণ সংকলক জানে। তবে এটি আরও ভাল কোডিং অনুশীলন।
বেনোইট

7
যেহেতু আপনি ভবিষ্যতের প্রুফ কোডটি লিখছেন, সেই sizeof x/sizeof *xকৌশলটি ব্যবহারের পরিবর্তে আপনার একটি নিরাপদ টেম্পলেট ব্যবহার করা উচিত: template <typename T, int N> int array_size( T (&)[N] ) { return N; }যেমন অ্যারের পরিবর্তে আপনি কোনও পয়েন্টারটি পাস করেন তবে তা ব্যর্থ হবে। প্রয়োজনে এটি একটি সংকলন ধ্রুবক হিসাবে রূপান্তর করা যেতে পারে, তবে একটি মন্তব্যে পড়তে এটি কিছুটা শক্ত হয়ে যায়।
ডেভিড রদ্রিগেজ - ড্রিবিস

4
@ ডেভিড: ভাল ধারণা, তবে আরও ভাল (এবং আমি ডান বলার সাহস করি) উপায় হ'ল অ্যারে সহ সমস্ত সাধারণ ধারক প্রকারের জন্য বিশেষত টেমপ্লেটগুলি সংজ্ঞায়িত করা begin()এবং end()সেগুলি ফাংশন করা instead জিওর উত্তর আমাকে ভাবায় যে এগুলি ইতিমধ্যে সি ++-এ যুক্ত করা হয়েছে, এখন মনে হয় তারা তা করেনি ... আমি লোকেরা কী বলতে চাইবে এবং তারপরে আপডেট হবে see
j_random_hacker

4
:) আমি একটা ছোট ইউটিলিটি হেডার সহ এই মত কয়েক বিট আছে যা আছে begin, end, size, STATIC_SIZE(ম্যাক্রো যে আয় আকার সঙ্গে একটি কম্পাইল সময় ধ্রুবক), কিন্তু সৎ হতে, আমি বললেই কি ছোট কোড নমুনা যে বাহিরে ব্যবহার করুন।
ডেভিড রদ্রিগেজ - ড্রিবিস

4
অ্যারের আকার std::extent<decltype(v)>::valueসি ++ 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

আপনি সি ++ এসটিএলতে বাছাই () ব্যবহার করতে পারেন। সাজান () ফাংশন সিনট্যাক্স:

 sort(array_name, array_name+size)      

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

2

এটি যতটা সহজ ... সি ++ আপনাকে এসটিএল (স্ট্যান্ডার্ড টেম্পলেট লাইব্রেরি) নামে একটি ফাংশন সরবরাহ করছে sort যা হ্যান্ড-কোডেড দ্রুত সাজানোর চেয়ে 20% থেকে 50% দ্রুত চলে।

এটির ব্যবহারের জন্য নমুনা কোডটি এখানে:

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

1

সি ++ বাছাই ফাংশন ব্যবহার করে

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

vector <int> v[100];

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

এটি পুরানো সংস্করণে কাজ করে। আমি এটি দিয়ে চেষ্টা করেছি:std::sort(arr, arr + arr_size)
কোড কুকার ২ '

এটি মোটেই কাজ করে না। এটি সি ++ নয় বলে কথা নয়।
এলএফ


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 টির চেয়ে কেন আলাদা এবং / বা তার চেয়ে বেশি ভাল তা ব্যাখ্যা করুন।
chb

1

C ++ 20 এ আসা রেঞ্জ লাইব্রেরির সাথে আপনি ব্যবহার করতে পারেন

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

4
সত্যি? আপনি স্ট্যান্ডার্ড লাইব্রেরির পরিবর্তে ধীর বুদ্বুদ সাজানোর ব্যবহার করতে চান? শুধু তাই নয়, আপনার একেবারে বাইরের ত্রুটিটি ইউবির সৃষ্টি করে।
মার্ক রান্সম

-1

তুমি ব্যবহার করতে পার,

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

হাই, এই প্রশ্নের ইতিমধ্যে একটি বিস্তৃত স্বীকৃত উত্তর আছে বলে মনে হচ্ছে। আপনি কি ব্যাখ্যা করতে পারেন যে এটি কীভাবে আলাদা?
স্টিফান

অ্যারে beginএবং endপদ্ধতি নেই। আপনি অবশ্যই একটি সম্পর্কে চিন্তা করা উচিত vector
মার্ক রান্সম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.