## set_symmetric_difference
## Prototype
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result); template <class InputIterator1, class InputIterator2, class OutputIterator, class StrictWeakOrdering> OutputIterator set_symmetric_difference(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result, StrictWeakOrdering comp); ## Description
In the simplest case, The two versions of ## DefinitionDefined in the standard header algorithm, and in the nonstandard backward-compatibility header algo.h. ## Requirements on typesFor the first version: -
`InputIterator1` is a model of InputIterator. -
`InputIterator2` is a model of InputIterator. -
`OutputIterator` is a model of OutputIterator. -
`InputIterator1` and`InputIterator2` have the same value type. -
`InputIterator` 's value type is a model of LessThanComparable. -
The ordering on objects of
`InputIterator1` 's value type is a*strict weak ordering*, as defined in the LessThanComparable requirements. -
`InputIterator` 's value type is convertible to a type in`OutputIterator` 's set of value types.
For the second version: -
`InputIterator1` is a model of InputIterator. -
`InputIterator2` is a model of InputIterator. -
`OutputIterator` is a model of OutputIterator. -
`StrictWeakOrdering` is a model of StrictWeakOrdering. -
`InputIterator1` and`InputIterator2` have the same value type. -
`InputIterator1` 's value type is convertible to`StrictWeakOrdering` 's argument type. -
`InputIterator` 's value type is convertible to a type in`OutputIterator` 's set of value types.
## PreconditionsFor the first version: -
`[first1, last1)` is a valid range. -
`[first2, last2)` is a valid range. -
`[first1, last1)` is ordered in ascending order according to`operator<` . That is, for every pair of iterators`i` and`j` in`[first1, last1)` such that`i` precedes`j` ,`*j < *i` is`false` . -
`[first2, last2)` is ordered in ascending order according to`operator<` . That is, for every pair of iterators`i` and`j` in`[first2, last2)` such that`i` precedes`j` ,`*j < *i` is`false` . -
There is enough space to hold all of the elements being copied. More formally, the requirement is that
`[result, result + n)` is a valid range, where`n` is the number of elements in the symmetric difference of the two input ranges. -
`[first1, last1)` and`[result, result + n)` do not overlap. -
`[first2, last2)` and`[result, result + n)` do not overlap.
For the second version: -
`[first1, last1)` is a valid range. -
`[first2, last2)` is a valid range. -
`[first1, last1)` is ordered in ascending order according to`comp` . That is, for every pair of iterators`i` and`j` in`[first1, last1)` such that`i` precedes`j` ,`comp(*j, *i)` is`false` . -
`[first2, last2)` is ordered in ascending order according to`comp` . That is, for every pair of iterators`i` and`j` in`[first2, last2)` such that`i` precedes`j` ,`comp(*j, *i)` is`false` . -
There is enough space to hold all of the elements being copied. More formally, the requirement is that
`[result, result + n)` is a valid range, where`n` is the number of elements in the symmetric difference of the two input ranges. -
`[first1, last1)` and`[result, result + n)` do not overlap. -
`[first2, last2)` and`[result, result + n)` do not overlap.
## ComplexityLinear. Zero comparisons if either ## Exampleinline 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', 'B', 'f', 'g', 'h', 'H'}; char A4[] = {'A', 'B', 'B', 'C', 'D', 'F', 'F', '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 << "Symmetric difference of A1 and A2: "; set_symmetric_difference(A1, A1 + N1, A2, A2 + N2, ostream_iterator<int>(cout, " ")); cout << endl << "Symmetric difference of A3 and A4: "; set_symmetric_difference(A3, A3 + N3, A4, A4 + N4, ostream_iterator<char>(cout, " "), lt_nocase); cout << endl; } The output is Symmetric difference of A1 and A2: 1 2 7 8 9 11 13 Symmetric difference of A3 and A4: B B C D F g H ## Notes[1] Even this is not a completely precise description, because the ordering by which the input ranges are sorted is permitted to be a strict weak ordering that is not a total ordering: there might be values ## See also |