Halo Saya punya pertanyaan sederhana:
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());
}
Dengan lebih dari 32 elemen, panggilan semacam itu swap
. Dengan 32 elemen atau kurang, elemen-elemen tersebut masih diurutkan tetapi swap
tidak disebut.
- Saya menggunakan MSVC ++ 2019 pada x64.
- Kapan
swap
dipanggil dan kapan tidak dan mengapa? Terima kasih! - Saya tidak menggunakan
swap
dalam penugasan salinan hanya untuk membedakan antara panggilan untuk itu dari mengurutkan dari operator penugasan salinan.
@ Evg Apakah itu persyaratan atau penjelasan untuk konteks khusus ini?
—
François Andrieux
@ FrançoisAndrieux, ini adalah detail implementasi perpustakaan standar Microsoft. Dugaan saya adalah bahwa ini adalah alasan perilaku yang diamati oleh OP. Saat ini saya sedang mencari kode sumber untuk mendapatkan lebih banyak detail.
—
Evg
Bagian yang relevan dari sumbernya adalah: di
—
ChrisMM
while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)
mana _ISORT_MAX
diberi nilai 32. Baris 3447 <algorithm>
menggunakan VS 16.5.0
Quicksort nyata tidak digunakan di perpustakaan standar modern dalam bahasa apa pun. Semua menggunakan versi campuran yang dimodifikasi yang hanya merupakan quicksort ketika jumlah elemen cukup besar. Misalnya Java dan Python menggunakan Timsort sementara .NET framework dan pustaka C ++ GCC menggunakan Introsort . libstdc ++ dan libc ++ juga menggunakan jenis penyisipan untuk urutan pendek. Lihat Algoritma apa yang digunakan dalam C ++ 11 std :: sortir dalam implementasi STL yang berbeda?
—
phuclv
std::sort
menggunakan sortasi penyisipan jika jumlah elemen 32 atau kurang, dan menggunakan sort cepat.