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

|
std::sort
通过使用
std::swap
交换元素,而
std::swap
则使用复制构造函数和赋值运算符,从而确保在交换值时获得正确的语义。 “ 2”通过简单地交换元素的基础位来交换元素,而忽略与要交换的类型相关的任何语义。 即使
qsort
忽略了您要排序的类型的语义,但对于非平凡的类型,它仍然非常有效。如果我没有记错的话,它将适用于所有标准容器,尽管它们不是POD类型。 我想
qsort
在on5ѭ类型上正常工作的前提是
T
是/可平移/的。在我的头顶上,唯一不容易移动的类型是那些带有内部指针的类型。例如:
struct NotTriviallyMovable
{
    NotTriviallyMovable() : m_someElement(&m_array[5]) {}

    int m_array[10];
    int* m_someElement;
};
如果您对
NotTriviallyMovable
数组进行排序,那么
m_someElement
最终将指向错误的元素。 我的问题是:what2ѭ还有哪些其他类型的类型不起作用?     
已邀请:
        对于具有指向“相关”对象的指针的类型,这都不起作用。这样的指针具有许多与“内部”指针相关的问题,但是要精确地证明“相关”对象是什么要困难得多。 一种特定的“相关”对象是带有反向指针的对象。如果将对象A和B进行位交换,并且A和C指向对方,则之后B将指向C,而C将指向A。     
        
qsort()
不能使用不是POD类型的任何类型。如果考虑使用C ++ 0x,则可能会有更多类型与ѭ11一起使用,因为它会更改POD的定义。如果要与ѭ11一起使用非POD类型,则说明您在UB领域,守护程序将从您的鼻子中飞出来。     
        您完全误会了。任何与
qsort
一起使用的非POD类型都是完整的,很幸运。如果您将处女的鲜血献给众神并先做一点舞蹈,那只是因为它恰好在您的平台上对您的平台起作用,而您的编译器却在蔚蓝的月亮上,这并不意味着它确实有效。 哦,这是另一种不易移动的类型,其实例在外部观察。您可以移动它,但不会通知观察者,因为您从未调用过swap或copy构造函数。     
\“如果我没记错的话,它将适用于所有标准容器\” 整个问题归结为,在什么实现中?您是否要按照标准进行编码,还是想对当今摆在您面前的编译器的实现细节进行编码?如果是后者,那么如果您所有的测试都通过了,我想它就可以了。 如果您要询问C ++编程语言,则仅对POD类型需要work2。如果您要问一个具体的实现,那是哪个?如果您要询问所有实现,那么您会错失良机,因为进行这种草率投票的最佳地点是C ++ 0x工作组会议,因为它们聚集了几乎每个组织的代表与积极维护的C ++实现。 对于它的价值,我可以很容易地想象一个ѭ16的实现,其中将列表节点嵌入到列表对象本身中,并用作头/尾标记。我不知道实际上有什么实现(如果有的话),因为使用空指针作为头/尾标记也很常见,但是用a来实现双向链接列表肯定有一些优势。两端的虚拟节点。这样的“ 16”实例当然不会轻易移动,因为其第一个和最后一个元素的节点将不再指向前哨。它的ѭ18实现和(在C ++ 0x中)其move构造函数将通过更新这些第一个和最后一个节点来解决此问题。 没有什么可以阻止您的编译器在其下一发行版中切换到此版本的
std::list
的实现,尽管这样做会破坏二进制兼容性,因此鉴于大多数编译器的管理方式,它必须是主要发行版。 类似地,map / set / multimap / multiset四重奏可能具有指向其父级的节点。可以想象,任何容器的调试迭代器都可能包含指向该容器的指针。要执行您想要的操作,您必须(至少)排除在其实现的任何部分中是否存在指向容器的任何指针,并且诸如“没有实现会使用这些技巧中的任何一个”这样的笼统语句是非常不明智。拥有标准的全部要点是对所有符合标准的实现进行陈述,因此,如果您尚未从标准中推论出结论,那么即使您的陈述在今天是正确的,明天也会变得不正确。     

要回复问题请先登录注册