नमस्ते, मेरा एक आसान सवाल है:
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
जाता है लेकिन कहा नहीं जाता है।
- मैं x 64 पर MSVC ++ 2019 का उपयोग कर रहा हूं।
- कब है
swap
कहा जाता है और कब नहीं और क्यों होता है? धन्यवाद! - मैंने
swap
कॉपी-असाइनमेंट का उपयोग केवल कॉपी-असाइनमेंट ऑपरेटर से सॉर्ट से अलग करने के लिए नहीं किया।
@ ईवीजी क्या इस विशेष संदर्भ के लिए एक आवश्यकता है या एक स्पष्टीकरण है?
—
फ्राँस्वा एंड्रीक्स
@ फ़्राँस्वाएंड्रीक्स, यह Microsoft मानक पुस्तकालय का कार्यान्वयन विवरण है। मेरा अनुमान है कि यह ओपी द्वारा देखे गए व्यवहार का कारण है। मैं वर्तमान में अधिक जानकारी हासिल करने के लिए स्रोत कोड देख रहा हूं।
—
Evg
स्रोत का प्रासंगिक हिस्सा है:
—
क्रिसमम
while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)
जहां _ISORT_MAX
32 का मान दिया गया है। <algorithm>
वी.एस. 16.5.0 का उपयोग करने वाली लाइन 3447
किसी भी भाषा में किसी भी आधुनिक मानक पुस्तकालयों में किसी भी वास्तविक क्विकॉर्ट का उपयोग नहीं किया जाता है। सभी मिश्रित मिश्रित संस्करणों का उपयोग करते हैं जो केवल एक क्विकॉर्ट है जब तत्वों की संख्या काफी बड़ी होती है। उदाहरण के लिए, जावा और पायथन Timsort का उपयोग करते हैं जबकि .NET फ्रेमवर्क और GCC का C ++ पुस्तकालय इंट्रोसोर्ट का उपयोग करते हैं । libstdc ++ और libc ++ भी लघु अनुक्रमों के लिए सम्मिलन प्रकार का उपयोग करते हैं। देखें कि C ++ 11 std :: विभिन्न STL कार्यान्वयन में किस एल्गोरिदम का उपयोग किया जाता है?
—
फुलकव
std::sort
यदि तत्वों की संख्या 32 या उससे कम है, तो सम्मिलन सॉर्ट पर रीसेट करता है और अन्यथा त्वरित सॉर्ट का उपयोग करता है।