Xin chào tôi có một câu hỏi đơn giản:
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());
}
Với hơn 32 yếu tố, các cuộc gọi sắp xếp swap
. Với 32 phần tử trở xuống, các phần tử vẫn được sắp xếp nhưng swap
không được gọi.
- Tôi đang sử dụng MSVC ++ 2019 trên x64.
- Khi nào được
swap
gọi và khi nào nó không và tại sao? Cảm ơn bạn! - Tôi đã không sử dụng
swap
trong chỉ định sao chép để phân biệt giữa cuộc gọi đến cuộc gọi từ nhà điều hành chuyển nhượng sao chép.
@Evg Đó có phải là một yêu cầu hay đó là một lời giải thích cho bối cảnh cụ thể này?
—
François Andrieux
@ FrançoisAndrieux, đây là chi tiết triển khai của thư viện chuẩn Microsoft. Tôi đoán rằng đây là lý do của hành vi được quan sát bởi OP. Tôi hiện đang xem xét mã nguồn để biết thêm chi tiết.
—
Evg
Phần có liên quan của nguồn là:
—
ChrisMM
while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)
nơi _ISORT_MAX
được cho giá trị là 32. Dòng 3447 <algorithm>
sử dụng VS 16.5.0
Không có quicksort thực sự được sử dụng trong bất kỳ thư viện tiêu chuẩn hiện đại trong bất kỳ ngôn ngữ. Tất cả đều sử dụng các phiên bản hỗn hợp đã sửa đổi, chỉ là bản tóm tắt khi số lượng phần tử đủ lớn. Ví dụ: Java và Python sử dụng Timsort trong khi .NET framework và thư viện C ++ của GCC sử dụng Introsort . libstdc ++ và libc ++ cũng sử dụng sắp xếp chèn cho các chuỗi ngắn. Xem những thuật toán nào được sử dụng trong C ++ 11 std :: sort trong các triển khai STL khác nhau?
—
phuclv
std::sort
sử dụng sắp xếp chèn nếu số lượng phần tử là 32 hoặc ít hơn và sử dụng sắp xếp nhanh khác.