Привіт, у мене просте запитання:
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çoisAndrieux, це детальна інформація про впровадження стандартної бібліотеки Microsoft. Я здогадуюсь, що це причина поведінки, яку спостерігає ОП. Зараз я переглядаю вихідний код, щоб отримати більше деталей.
—
Evg
Відповідна частина джерела:
—
ChrisMM
while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)
там, де _ISORT_MAX
задано значення 32. Рядок 3447 <algorithm>
використання VS 16.5.0
Жоден справжній кваксор не використовується в жодних сучасних стандартних бібліотеках будь-якими мовами. Усі користуються модифікованими змішаними версіями, які є лише хитким стилем, коли кількість елементів досить велика. Наприклад, Java та Python використовують Timsort, тоді як .NET Framework та бібліотека C ++ GCC використовують Introsort . libstdc ++ і libc ++ також використовують сортування вставки для коротких послідовностей. Дивіться, які алгоритми використовуються в C ++ 11 std :: сортування в різних реалізаціях STL?
—
phuclv
std::sort
вдається до сортування вставки, якщо кількість елементів становить 32 або менше, і використовує швидке сортування в іншому випадку.