类别: 算法 | 组件类型: 函数 |
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)中,或两者中。一般情况更为复杂,因为输入范围可能包含重复元素。泛化是,如果某个值在m次在[first1, last1)和n次在[first2, last2)(其中m或n可能为零),则它在输出范围内出现max(m,n)次。 [1]Set_union是稳定的,这意味着每个输入范围内的元素的相对顺序都得以保留,并且如果一个元素同时出现在两个输入范围内,则从第一个范围而不是第二个范围内复制该元素。
的两个版本set_union在如何定义一个元素小于另一个元素方面有所不同。第一个版本使用operator<比较对象,而第二个版本使用 函数对象comp.
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] 即使这样也不是完全精确的描述,因为允许输入范围排序的顺序是严格弱排序,而不是全排序:可能存在值x和y是等效的(即,既不是x < y也不是y < x),但并不相等。有关更完整的讨论,请参见 小于可比较 要求。如果范围[first1, last1)包含m个相互等效的元素,而范围[first2, last2)包含n包含来自该等效类的元素(其中任何一个m或n可能为零),则输出范围包含max(m, n)个来自该等效类的元素。具体来说,m个这些元素将从[first1, last1)和max(n-m, 0)个这些元素将从[first2, last2)中复制。请注意,这种精确度只有在元素可以等效但不相等的情况下才重要。如果您使用的是全排序(如果您使用的是strcmp,例如,或者如果您对整数使用普通的算术比较),那么您可以忽略这种技术上的区别:对于全排序,相等和等效是相同的。