std::sort通过 using 交换元素std::swap,后者又使用复制构造函数和赋值运算符,确保在交换值时获得正确的语义。
qsort通过简单地交换元素的底层位来交换元素,忽略与您正在交换的类型相关的任何语义。
即使qsort不知道要排序的类型的语义,它仍然可以很好地处理非平凡的类型。如果我没记错的话,它适用于所有标准容器,尽管它们不是 POD 类型。
我认为qsort在一个类型上正确工作T的先决条件T是 /trivially 可移动 /。在我的脑海中,唯一不能轻易移动的类型是那些具有内部指针的类型。例如:
struct NotTriviallyMovable
{
NotTriviallyMovable() : m_someElement(&m_array[5]) {}
int m_array[10];
int* m_someElement;
};
如果你对一个数组进行排序,NotTriviallyMovable那么m_someElements 最终会指向错误的元素。
我的问题是:还有哪些其他类型不适用qsort?