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_someElement
s 最终会指向错误的元素。
我的问题是:还有哪些其他类型不适用qsort
?