如果范围未排序,inplace_merge 会做什么?

Ere*_*evi 2 c++ stl

inplace_merge 的文档说“范围必须排序”。但是,它没有说明如果范围未排序会发生什么。我尝试将它与未排序的范围一起使用,结果是一个未排序的数组,但这可能取决于编译器。由于缺乏有关此案例的文档,我可以得出什么结论 - 这是否意味着,如果范围未排序,结果是未定义的行为?(例如:如果范围未排序,是否允许符合标准的编译器创建分段错误?)

rus*_*tyx 5

inplace_merge要求对输入进行排序,这在[alg.merge]中指定:

要求:[first, middle)[middle, last)应是根据和排序的有效范围。compproj

因此严格来说,提供未排序的输入inplace_merge未定义的行为,故事结束了。

但标准也要求它稳定且复杂度为O(N)

这给我们带来了唯一可能的实现,使用双指针算法:同时遍历两个范围,通过在每一步中选择两个范围中的最小元素将它们“压缩”在一起。

因此,在实践中,它很可能会执行完成,但结果未排序。