c++ - qsort 不适用于 C++ 中的哪些类型?

标签 c++ sorting generic-programming qsort move-semantics

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/

相关文章:

java - 根据输入进行切换并返回动态值

c++ - 如何结束在c++中显示菜单的重复?

c++ - 使用 map 时 WinAPI WndProc 静默失败

javascript - 在 JavaScript 中减少数据后排序

java - 查找单词中第一个元音出现的位置

graphics - 常见的 lisp 类型与 defgeneric 运行时分析

c++ - `std::tuple<int[N]>` 有什么用?

c++ - 如何自定义ostream C++

java - 无法将文件从我的计算机本地目录加载到java程序

java - 列表元素的通用类