SGI

合并

类别:算法 组件类型:函数

原型

Merge是一个重载名称:实际上有两个合并函数。
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result);

template <class InputIterator1, class InputIterator2, class OutputIterator,
          class StrictWeakOrdering>
OutputIterator merge(InputIterator1 first1, InputIterator1 last1,
                     InputIterator2 first2, InputIterator2 last2,
                     OutputIterator result, StrictWeakOrdering comp);

描述

Merge将两个已排序的范围[first1, last1)[first2, last2)合并成一个已排序的范围。也就是说,它将元素从[first1, last1)[first2, last2)复制到[result, result + (last1 - first1) + (last2 - first2))使得结果范围按升序排列。Merge是稳定的,这意味着每个输入范围内的元素的相对顺序都得以保留,并且对于两个输入范围中相等的[1]元素,第一个范围中的元素位于第二个范围中的元素之前。返回值为result + (last1 - first1) + (last2 - first2).

的两个版本合并在元素比较的方式上有所不同。第一个版本使用operator<。也就是说,输入范围和输出范围满足以下条件:对于每一对迭代器ij使得ij, *j < *i。第二个版本使用函数对象comp。也就是说,输入范围和输出范围满足以下条件:对于每一对迭代器ij使得ij, comp(*j, *i).

定义

在标准头文件algorithm中定义,并在非标准向后兼容头文件algo.h中定义。

类型要求

对于第一个版本对于第二个版本

先决条件

对于第一个版本对于第二个版本

复杂度

线性。如果两个[first1, last1)[first2, last2)都是空范围,则不进行比较,否则最多进行(last1 - first1) + (last2 - first2) - 1次比较。

示例

int main()
{
  int A1[] = { 1, 3, 5, 7 };
  int A2[] = { 2, 4, 6, 8 };
  const int N1 = sizeof(A1) / sizeof(int);
  const int N2 = sizeof(A2) / sizeof(int);

  merge(A1, A1 + N1, A2, A2 + N2, 
        ostream_iterator<int>(cout, " "));
  // The output is "1 2 3 4 5 6 7 8"
}

注释

[1] 请注意,您可以使用严格弱排序但不是全排序的排序;也就是说,可能存在值xy使得x < y, x > y,以及x == y都是假。(请参阅小于可比较要求以了解更多信息。)两个元素xy等价的,如果既不x < y也不y < x。但是,如果您使用全排序(例如,如果您使用strcmp,或者如果您对整数使用普通的算术比较),那么您可以忽略此技术区别:对于全排序,相等和等价是相同的。

另请参阅

inplace_merge, set_union, sort
[Silicon Surf] [STL Home]
版权所有 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息