SGI

set_union

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

原型

Set_union是一个重载的名称;实际上有两个set_union函数。
template <class InputIterator1, class InputIterator2, class OutputIterator>
OutputIterator set_union(InputIterator1 first1, InputIterator1 last1,
                         InputIterator2 first2, InputIterator2 last2,
                         OutputIterator result);

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

描述

Set_union构造一个排序后的范围,该范围是排序后的范围的并集[first1, last1)[first2, last2). 返回值是输出范围的末尾。

在最简单的情况下,set_union执行集合论中的“并集”操作:输出范围包含包含在[first1, last1), [first2, last2)中,或两者中。一般情况更为复杂,因为输入范围可能包含重复元素。泛化是,如果某个值在m次在[first1, last1)n次在[first2, last2)(其中mn可能为零),则它在输出范围内出现max(m,n)次。 [1]Set_union是稳定的,这意味着每个输入范围内的元素的相对顺序都得以保留,并且如果一个元素同时出现在两个输入范围内,则从第一个范围而不是第二个范围内复制该元素。

的两个版本set_union在如何定义一个元素小于另一个元素方面有所不同。第一个版本使用operator<比较对象,而第二个版本使用 函数对象comp.

定义

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

对类型的要求

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

先决条件

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

复杂度

线性。如果任何一个[first1, last1)[first2, last2)为空,则比较次数为零,否则最多为2 * ((last1 - first1) + (last2 - first2)) - 1次比较。

示例

inline bool lt_nocase(char c1, char c2) { return tolower(c1) < tolower(c2); }

int main()
{
  int A1[] = {1, 3, 5, 7, 9, 11};
  int A2[] = {1, 1, 2, 3, 5, 8, 13};  
  char A3[] = {'a', 'b', 'B', 'B', 'f', 'H'};
  char A4[] = {'A', 'B', 'b', 'C', 'D', 'F', 'F', 'h', 'h'};

  const int N1 = sizeof(A1) / sizeof(int);
  const int N2 = sizeof(A2) / sizeof(int); 
  const int N3 = sizeof(A3);
  const int N4 = sizeof(A4);

  cout << "Union of A1 and A2: ";
  set_union(A1, A1 + N1, A2, A2 + N2,
            ostream_iterator<int>(cout, " "));
  cout << endl 
       << "Union of A3 and A4: ";
  set_union(A3, A3 + N3, A4, A4 + N4, 
            ostream_iterator<char>(cout, " "),
            lt_nocase);
  cout << endl;
}

输出为

Union of A1 and A2: 1 1 2 3 5 7 8 9 11 13 
Union of A3 and A4: a b B B C D f F H h 

注释

[1] 即使这样也不是完全精确的描述,因为允许输入范围排序的顺序是严格弱排序,而不是全排序:可能存在值xy是等效的(即,既不是x < y也不是y < x),但并不相等。有关更完整的讨论,请参见 小于可比较 要求。如果范围[first1, last1)包含m个相互等效的元素,而范围[first2, last2)包含n包含来自该等效类的元素(其中任何一个mn可能为零),则输出范围包含max(m, n)个来自该等效类的元素。具体来说,m个这些元素将从[first1, last1)max(n-m, 0)个这些元素将从[first2, last2)中复制。请注意,这种精确度只有在元素可以等效但不相等的情况下才重要。如果您使用的是全排序(如果您使用的是strcmp,例如,或者如果您对整数使用普通的算术比较),那么您可以忽略这种技术上的区别:对于全排序,相等和等效是相同的。

另请参见

includes, set_intersection, set_difference, set_symmetric_difference, sort, merge
[Silicon Surf] [STL Home]
版权 © 1999 Silicon Graphics, Inc. 保留所有权利。 商标信息