কেন আমার স্টেটেন্টে 32 টিরও বেশি উপাদান রয়েছে তবে কেবল অদলবদলকে std :: বাছাই কেন বলা হয়?


13

হ্যালো আমার একটি সহজ প্রশ্ন আছে:

class A 
{
public:
    A(int);
    A(const A&);
    A& operator=(const A&);
    ~A();
private:
    int* ptr_;

    friend bool operator<(const A&, const A&);
    friend void swap(A&, A&);
};

A::A(int x) : 
    ptr_(new int(x))
{}

A::A(const A& rhs) :
    ptr_(rhs.ptr_ ? new int(*rhs.ptr_) : nullptr)
{}

A& A::operator = (const A & rhs)
{
    int* tmp = rhs.ptr_ ? new int(*rhs.ptr_) : nullptr;
    delete ptr_;
    ptr_ = tmp;

    return *this;
}

A::~A()
{
    delete ptr_;
}

bool operator<(const A& lhs, const A& rhs)
{
    cout << "operator<(const A&, const A&)" << endl;
    return *lhs.ptr_ < *rhs.ptr_;
}

void swap(A& lhs, A& rhs)
{
    cout << "swap(A&, A&)" << endl;
    using std::swap;
    swap(lhs.ptr_, rhs.ptr_);
}

int main()
{

    std::vector<A> v{ 33,32,31,30,29,28,27,26,25,24,23,22, 21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5, 4,3,2,1 };
    std::sort(v.begin(), v.end());

}

32 টিরও বেশি উপাদান সহ, বাছাই কল swap। 32 টি উপাদান বা তারও কম সহ, উপাদানগুলি এখনও সাজানো হয় তবে swapবলা হয় না।

  • আমি x64 এ এমএসভিসি ++ 2019 ব্যবহার করছি।
  • কখন swapডাকা হয় এবং কখন হয় না এবং কেন? ধন্যবাদ!
  • আমি swapকেবল অনুলিপি-অ্যাসাইনমেন্ট অপারেটর থেকে কল থেকে কল করার মধ্যে পার্থক্য করতে ব্যবহার করিনি ।

6
std::sortউপাদানগুলির সংখ্যা 32 বা তার চেয়ে কম হলে সন্নিবেশ সজ্জাতে রিসর্ট করে এবং অন্যথায় দ্রুত বাছাই করে।
এভগ

@ এভগ এটি কি একটি প্রয়োজনীয়তা বা এটি এই নির্দিষ্ট প্রসঙ্গে ব্যাখ্যা?
ফ্রান্সোইস অ্যান্ডরিয়াক্স

2
@ ফ্রানসোয়াআন্ড্রিয়াক্স, এটি মাইক্রোসফ্ট স্ট্যান্ডার্ড লাইব্রেরির একটি বাস্তবায়ন বিশদ। আমার ধারণা হ'ল এটিই ওপি কর্তৃক পরিপূর্ণ আচরণের কারণ। আমি বর্তমানে আরও বিশদ পাওয়ার জন্য সোর্স কোডটি সন্ধান করছি।
এভগ

1
উৎস প্রাসঙ্গিক অংশ: while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)যেখানে _ISORT_MAX32 এর মান দেওয়া হয় রেখা 3447 <algorithm>বনাম 16.5.0 ব্যবহার
ChrisMM

কোনও ভাষাতে কোনও আধুনিক মানক পাঠাগারগুলিতে আসল কুইকোর্ট ব্যবহার করা হয় না। সমস্ত সংশোধিত মিশ্র সংস্করণ ব্যবহার করে যা কেবলমাত্র উপাদানগুলির সংখ্যা পর্যাপ্ত পরিমাণে বড় হওয়ার পরে একটি quicksort হয়। উদাহরণস্বরূপ জাভা এবং পাইথন টিমসোর্ট ব্যবহার করে যখন .NET ফ্রেমওয়ার্ক এবং জিসিসির সি ++ লাইব্রেরি ইন্টারসোর্ট ব্যবহার করে । libstdc ++ এবং libc ++ সংক্ষিপ্ত অনুক্রমের জন্য সন্নিবেশ বাছাইও ব্যবহার করে। দেখুন বিভিন্ন এসটিএল বাস্তবায়নে সি ++ ১১ টি স্ট্যান্ড :: সাজানোর ক্ষেত্রে কোন অ্যালগরিদম ব্যবহার করা হয়?
phuclv

উত্তর:


14

মাইক্রোসফ্ট std::sortবাস্তবায়ন এর মত দেখাচ্ছে :

const int ISORT_MAX = 32;  // maximum size for insertion sort

template<class RanIt, class Diff, class Pr>
void Sort(RanIt First, RanIt Last, Diff Ideal, Pr Pred)
{
    Diff Count;
    for (; ISORT_MAX < (Count = Last - First) && 0 < Ideal; )
    {   // divide and conquer by quicksort
        pair<RanIt, RanIt> Mid = Unguarded_partition(First, Last, Pred);

        // ...
    }

    if (ISORT_MAX < Count)
    {   // heap sort if too many divisions
        Make_heap(First, Last, Pred);
        Sort_heap(First, Last, Pred);
    }
    else if (1 < Count)
        Insertion_sort(First, Last, Pred);  // small
}

যখন বাছাই করার ব্যাপ্তিতে 32 টি উপাদান বা তারও কম থাকে, Sortসন্নিবেশ সারণি ব্যবহার করে। সন্নিবেশ বাছাই swapএর বাস্তবায়নে ব্যবহার করে না । অন্যথায়, বিভাজন এবং বিজয়ী দ্রুত সাজানোর ব্যবহার করা হয়। ইন বাস্তবায়ন এটা কল iter_swap(অভ্যন্তরীণ Unguarded_partition), যা পালা কল swap:

template<class FwdIt1, class FwdIt2>
void iter_swap(FwdIt1 Left, FwdIt2 Right)
{   // swap *Left and *Right
    swap(*Left, *Right);
}

এই সমস্ত বাস্তবায়ন বিবরণ। এগুলি এক স্ট্যান্ডার্ড লাইব্রেরি প্রয়োগের থেকে অন্যটিতে পরিবর্তিত হয়।


1
লাইবসিএক্সএক্স টাইপের উপর নির্ভর করে 6 বা 30 এর চেয়ে কম দৈর্ঘ্যের ক্রমগুলির জন্য সন্নিবেশ বাছাই ব্যবহার করে। libstd ++ 16 টি উপাদান বা তার কমের ক্রমগুলির জন্য তা করে। বিভিন্ন এসটিএল বাস্তবায়নে সি ++ 11 স্টাড :: সাজানোর ক্ষেত্রে কোন অ্যালগরিদম ব্যবহার করা হয়?
ফুক্লভি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.