std::sort
使用 std::swap
交换元素,后者又使用复制构造函数和赋值运算符,确保在交换元素时获得正确的语义值(value)观。
qsort
通过简单地交换元素的底层位来交换元素,忽略与您正在交换的类型相关的任何语义。
即使 qsort
不知道您正在排序的类型的语义,它仍然可以很好地处理非平凡类型。如果我没记错的话,它适用于所有标准容器,尽管它们不是 POD 类型。
我想 qsort
在类型 T
上正确工作的先决条件是 T
是/trivially movable/。在我的脑海中,唯一不可 move 的类型是那些具有内部指针的类型。例如:
struct NotTriviallyMovable
{
NotTriviallyMovable() : m_someElement(&m_array[5]) {}
int m_array[10];
int* m_someElement;
};
如果您对 NotTriviallyMovable
数组进行排序,则 m_someElement
最终会指向错误的元素。
我的问题是:还有哪些其他类型不能与 qsort
一起使用?
最佳答案
任何不是 POD 类型的类型都不能用于 qsort()
。如果您考虑 C++0x,可能会有更多类型可用于 qsort()
,因为它更改了 POD 的定义.如果您打算将非 POD 类型与 qsort()
一起使用,那么您将置身于 UB 领域,守护进程会从您的 Nose 里飞出来。
关于c++ - qsort 不适用于 C++ 中的哪些类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6174955/