The OpenD Programming Language

setSymmetricDifference

Lazily computes the symmetric difference of r1 and r2, i.e. the elements that are present in exactly one of r1 and r2. The two ranges are assumed to be sorted by less, and the output is also sorted by less. The element types of the two ranges must have a common type.

If both ranges are sets (without duplicated elements), the resulting range is going to be a set. If at least one of the ranges is a multiset, the number of occurences of an element x in the resulting range is abs(a-b) where a is the number of occurences of x in r1, b is the number of occurences of x in r2, and abs is the absolute value.

If both arguments are ranges of L-values of the same type then SetSymmetricDifference will also be a range of L-values of that type.

SetSymmetricDifference!(less, R1, R2)
setSymmetricDifference
(
alias less = "a < b"
R1
R2
)
(
R1 r1
,
R2 r2
)

Parameters

less

Predicate the given ranges are sorted by.

r1 R1

The first range.

r2 R2

The second range.

Return Value

Type: SetSymmetricDifference!(less, R1, R2)

A range of the symmetric difference between r1 and r2.

Examples

import std.algorithm.comparison : equal;
import std.range.primitives : isForwardRange;

// sets
int[] a = [ 1, 2, 4, 5, 7, 9 ];
int[] b = [ 0, 1, 2, 4, 7, 8 ];
assert(equal(setSymmetricDifference(a, b), [0, 5, 8, 9][]));
static assert(isForwardRange!(typeof(setSymmetricDifference(a, b))));

//mutisets
int[] c = [1, 1, 1, 1, 2, 2, 2, 4, 5, 6];
int[] d = [1, 1, 2, 2, 2, 2, 4, 7, 9];
assert(equal(setSymmetricDifference(c, d), setSymmetricDifference(d, c)));
assert(equal(setSymmetricDifference(c, d), [1, 1, 2, 5, 6, 7, 9]));

See Also

Meta