Merhaba Basit bir sorum var:
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'den fazla öğe ile, sıralama çağırır swap
. 32 veya daha az eleman olduğunda, elemanlar hala sıralanır ancak swap
çağrılmaz.
- X64'te MSVC ++ 2019 kullanıyorum.
- Ne zaman
swap
çağrılır ve ne zaman çağrılmaz ve neden? Teşekkür ederim! swap
Kopya atamada, yalnızca çağrıyı kopya atama işlecinden ayırmak için ayırmak için kullanmadım .
@Evg Bu bir gereklilik mi yoksa bu bağlam için bir açıklama mı?
—
François Andrieux
@ FrançoisAndrieux, bu Microsoft standart kütüphanesinin uygulama detayıdır. Benim tahminim OP'nin gözlemlediği davranışın nedeni budur. Şu anda daha fazla ayrıntı elde etmek için kaynak kodunu arıyorum.
—
Evg
Kaynağın ilgili kısmı:
—
ChrisMM
while (_ISORT_MAX < (_Count = _Last - _First) && 0 < _Ideal)
nerede _ISORT_MAX
32 değeri verilir. <algorithm>
VS 16.5.0 kullanım satırı 3447
Herhangi bir dilde modern standart kütüphanelerde gerçek bir hızlı sıralama kullanılmaz. Tümü, yalnızca öğe sayısı yeterince büyük olduğunda hızlı bir sıralama olan değiştirilmiş karışık sürümleri kullanır. Örneğin, Java ve Python Timsort kullanırken .NET çerçevesi ve GCC'nin C ++ kütüphanesi Introsort kullanıyor . libstdc ++ ve libc ++ ayrıca kısa diziler için ekleme sıralaması kullanır. Bkz . Farklı STL uygulamalarında C ++ 11 std :: sort'de hangi algoritmalar kullanılır?
—
phuclv
std::sort
eleman sayısı 32 veya daha azsa ekleme sıralamasına başvurur, aksi takdirde hızlı sıralama kullanır.