兩個排序範圍的並集
兩組中的並集由一組中任一組或兩者中存在的元素形成。第二個範圍中的元素在第一個範圍中具有等效元素的元素不會複製到結果範圍。
在第一個版本中使用operator <進行比較,在第二個版本中使用comp進行比較。如果(!(a <b)&&!(b <a))或if(!comp(a,b)&&!comp(b,a)),則認為兩個元素a和b是等效的。
範圍內的元素應已排序。
1.使用默認運算符<:
Template: OutputIterator set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); 參數: first1, last1 Input iterators to the initial and final positions of the first sorted sequence. The range used is [first1, last1], which contains all the elements between first1 and last1, including the element pointed by first1 but not the element pointed by last1. first2, last2 Input iterators to the initial and final positions of the second sorted sequence. The range used is [first2, last2]. result Output iterator to the initial position of the range where the resulting sequence is stored. comp Binary function that accepts two arguments of the types pointed by the input iterators, and returns a value convertible to bool. The function shall not modify any of its arguments. This can either be a function pointer or a function object. The ranges shall not overlap.
// CPP program to illustrate
// std::set_union
#include <iostream> // std::cout
#include <algorithm> // std::set_union, std::sort
#include <vector> // std::vector
// Driver code
int main()
{
int first[] = { 5, 10, 15, 20, 25 };
int second[] = { 50, 40, 30, 20, 10 };
int n = sizeof(first) / sizeof(first[0]);
// Print first array
std::cout << "First array contains:";
for (int i = 0; i < n; i++)
std::cout << " " << first[i];
std::cout << "\n";
// Print second array
std::cout << "Second array contains:";
for (int i = 0; i < n; i++)
std::cout << " " << second[i];
std::cout << "\n\n";
std::vector<int> v(10);
std::vector<int>::iterator it, st;
std::sort(first, first + n);
std::sort(second, second + n);
// Using default function
it = std::set_union(first, first + n, second, second + n, v.begin());
std::cout << "The union has " << (it - v.begin()) << " elements:\n";
for (st = v.begin(); st != it; ++st)
std::cout << ' ' << *st;
std::cout << '\n';
return 0;
}
輸出:
First array contains:5 10 15 20 25 Second array contains:50 40 30 20 10 The union has 8 elements: 5 10 15 20 25 30 40 50
2.使用自定義函數:語法:
Template: OutputIterator set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, Compare comp); 參數: first1, last1, first2, last2, result are same as above. comp Binary function that accepts two arguments of the types pointed by the input iterators, and returns a value convertible to bool. The function shall not modify any of its arguments. This can either be a function pointer or a function object. The ranges shall not overlap.
// CPP program to demonstrate use of
// std::set_symmetric_difference
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
// Driver code
int main()
{
string first[] = { "Sachin", "Rakesh", "Sandeep", "Serena" };
string second[] = { "Vaibhav", "Sandeep", "Rakesh", "Neha" };
int n = sizeof(first) / sizeof(first[0]);
// Print students of first list
cout << "Students in first subject:";
for (int i = 0; i < n; i++)
cout << " " << first[i];
cout << "\n";
// Print students of second list
cout << "Students in second subject:";
for (int i = 0; i < n; i++)
cout << " " << second[i];
cout << "\n\n";
vector<string> v(10);
vector<string>::iterator it, st;
// Sorting both the list
sort(first, first + n);
sort(second, second + n);
// Using default operator<
it = set_union(first, first + n, second, second + n, v.begin());
cout << "Students attending both subjects are:\n";
for (st = v.begin(); st != it; ++st)
cout << ' ' << *st;
cout << '\n';
return 0;
}
輸出:
First array contains:5 10 15 20 25 Second array contains:50 40 30 20 10 The union has 8 elements: 5 10 15 20 25 30 40 50
可能的應用:用於查找一個容器或兩個容器中存在的元素。
1.可用於查找同時參加這兩個科目的所有學生的名單。
// CPP program to demonstrate use of
// std::set_symmetric_difference
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;
// Driver code
int main()
{
string first[] = { "John", "Bob", "Mary", "Serena" };
string second[] = { "Jim", "Mary", "John", "Bob" };
int n = sizeof(first) / sizeof(first[0]);
// Print students of first list
cout << "Students in first subject:";
for (int i = 0; i < n; i++)
cout << " " << first[i];
cout << "\n";
// Print students of second list
cout << "Students in second subject:";
for (int i = 0; i < n; i++)
cout << " " << second[i];
cout << "\n\n";
vector<string> v(10);
vector<string>::iterator it, st;
// Sorting both the list
sort(first, first + n);
sort(second, second + n);
// Using default operator<
it = set_union(first, first + n, second, second + n, v.begin());
cout << "Students attending both subjects are:\n";
for (st = v.begin(); st != it; ++st)
cout << ' ' << *st;
cout << '\n';
return 0;
}
輸出:
Students in first subject:Sachin Rakesh Sandeep Serena Students in second subject:Vaibhav Sandeep Rakesh Neha Students attending both subjects are: Neha Rakesh Sachin Sandeep Serena Vaibhav
2.也可以用來查找兩個集合的並集。
程序在上麵給出。
相關用法
注:本文由純淨天空篩選整理自 std::set_union in C++。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。