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

时间:2019-05-18 19:45:02

标签: c++ stl

documentation to inplace_merge说“必须对范围进行排序”。但是,它没有说如果不对范围进行排序会发生什么。我尝试将其与未排序范围一起使用,结果是未排序数组,但这可能取决于编译器。从缺少有关此案例的文档中可以得出什么结论?是否表示如果范围未排序,结果为undefined behavior? (例如:如果不对范围进行排序,是否允许符合标准的编译器创建分段错误?)

1 个答案:

答案 0 :(得分:4)

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

  

要求:相对于comp [第一,中间) [中间,最后)是有效范围排序proj

严格来说,向inplace_merge提供未分类的输入就是undefined behavior,这是故事的结尾。

但是该标准还要求其稳定且O(N) complexity

使用two-pointer algorithm将我们带到了唯一可能的实现方式:同时遍历两个范围,通过在每个步骤中从两个范围中选择最小的元素将它们“压缩”在一起。

因此,在实践中,它很可能会执行到完成,并产生未排序的结果。