std::sort
使用std::swap
交换元素,而std::swap
使用复制构造函数和赋值运算符进行交换,确保在交换值时获得正确的语义。
qsort
通过简单地交换元素的基础位来交换元素,并忽略与正在交换的类型相关联的任何语义。
尽管qsort
对于您要排序的类型的语义一无所知,但它仍然能够非常好地处理非平凡类型。如果我没记错的话,它将适用于所有标准容器,尽管它们不是POD类型。
我认为qsort
在类型T
上正常工作的先决条件是T
可以/trivially movable/。从我的经验来看,唯一不是trivially movable的类型是具有内部指针的类型。例如:
struct NotTriviallyMovable
{
NotTriviallyMovable() : m_someElement(&m_array[5]) {}
int m_array[10];
int* m_someElement;
};
如果您对一个
NotTriviallyMovable
数组进行排序,那么m_someElement
指针将指向错误的元素。我的问题是:还有哪些类型无法与
qsort
一起使用?
move-semantics
标签有点令人困惑,因为它通常与C++0x的移动语义相关联。 - Björn Pollexqsort
对于任何非POD类型都是未定义的行为。从那里开始,它将会破坏哪些特定情况以及如何破坏并不重要:无论如何都不应该使用它。 - David Rodríguez - dribeasqsort
?在我检查的所有平台上,std::sort
都更快(对于可平凡交换的对象类型),这是完全合理的,因为可以选择内联比较运算符。 - Christopher Creutzigstd::sort
时,它的速度大约快了两倍,因为它是原地排序(没有内存分配)。使用C++0x,对于大多数类型,我们甚至可以免费获得移动构造函数,因此当安全时,交换操作就像位拷贝一样好。那么你为什么还要费心去使用qsort
呢? - Matthieu M.