qsort在C++中不适用哪种类型?

Pet*_*der 5 c++ sorting generic-programming qsort move-semantics

std::sort通过使用交换元素std::swap,而元素又使用复制构造函数和赋值运算符,保证在交换值时获得正确的语义.

qsort 通过简单地交换元素的基础位来交换元素,忽略与您交换的类型相关的任何语义.

即使qsort不知道你正在排序的类型的语义,它仍然非常适用于非平凡的类型.如果我没有弄错的话,它将适用于所有标准容器,尽管它们不是POD类型.

我想,对于先决条件qsort上的一种正常工作TT为/平凡移动/.在我的脑海中,唯一不易移动的类型是具有内部指针的类型.例如:

struct NotTriviallyMovable
{
    NotTriviallyMovable() : m_someElement(&m_array[5]) {}

    int m_array[10];
    int* m_someElement;
};
Run Code Online (Sandbox Code Playgroud)

如果你排序了一个数组,NotTriviallyMovable那么m_someElements最终会指向错误的元素.

我的问题是:还有哪些其他类型不适用qsort

wil*_*ilx 5

任何不是POD类型的类型都不可用qsort().qsort()如果考虑C++ 0x,可能会有更多类型可用,因为它会更改POD的定义.如果你打算使用非POD类型,qsort()那么你就在UB的土地上,守护进程会飞出你的鼻子.

  • @Peter:你完全错了.这样做不仅仅是'hacky'或者使用特定于实现的行为 - 它是未定义的. (4认同)

MSa*_*ers 2

这对于具有指向“相关”对象的指针的类型也不起作用。此类指针具有许多与“内部”指针相关的问题,但要准确证明“相关”对象是什么要困难得多。

一种特定类型的“相关”对象是具有反向指针的对象。如果对象 A 和 B 进行了位交换,并且 A 和 C 相互指向,那么之后 B 将指向 C,但 C 将指向 A。