สวัสดีฉันมีคำถามง่าย ๆ :
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
ไม่ได้เรียกว่า
- ฉันใช้ MSVC ++ 2019 ใน x64
- เมื่อไหร่ที่ถูก
swap
เรียกและเมื่อไรที่ไม่ได้และทำไม ขอบคุณ! - ฉันไม่ได้ใช้
swap
ในการคัดลอกการมอบหมายเพื่อแยกความแตกต่างระหว่างการโทรจากการเรียงลำดับจากผู้ดำเนินการคัดลอกการมอบหมาย
@Evg นั่นเป็นข้อกำหนดหรือว่าเป็นคำอธิบายสำหรับบริบทเฉพาะนี้หรือไม่?
—
François Andrieux
@ FrançoisAndrieuxนี่คือรายละเอียดการใช้งานของไลบรารีมาตรฐานของ Microsoft ฉันเดาว่านี่คือเหตุผลของพฤติกรรมที่สังเกตโดย OP ฉันกำลังดูซอร์สโค้ดเพื่อรับรายละเอียดเพิ่มเติม
—
Evg
ส่วนที่เกี่ยวข้องของแหล่งที่มาคือ:
—
ChrisMM
while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)
ที่_ISORT_MAX
ได้รับค่า 32 บรรทัด 3447 ของการ<algorithm>
ใช้ VS 16.5.0
ไม่มีการใช้ quicksort จริงในไลบรารีมาตรฐานที่ทันสมัยในภาษาใด ๆ ใช้ผสมเวอร์ชันดัดแปลงทั้งหมดซึ่งเป็นเพียงอย่างรวดเร็วเมื่อจำนวนองค์ประกอบมีขนาดใหญ่พอ ตัวอย่างเช่น Java และ Python ใช้ Timsortขณะที่กรอบ NET และ GCC ของ C ++ ใช้งานห้องสมุดIntrosort libstdc ++ และ libc ++ ใช้การเรียงลำดับการแทรกสำหรับลำดับสั้น ๆ ดูอัลกอริทึมใดที่ใช้ใน C ++ 11 std :: sort ในการใช้งาน STL ที่แตกต่างกัน?
—
phuclv
std::sort
การเรียงลำดับการแทรกหากจำนวนองค์ประกอบเป็น 32 หรือน้อยกว่าและใช้การเรียงลำดับอย่างรวดเร็ว