template > void uniques(InputIterator begin, InputIterator end, UnaryFunction f, Compare comp = Compare()) { while (begin != end) { InputIterator next = std::next(begin), find = std::find_if(next, end, [&] (auto& value) { return !comp(*begin, value); }); if (next == find) { f(*begin); } begin = find; } } template > void intersect(InputIterator1 begin1, InputIterator1 end1, InputIterator2 begin2, InputIterator2 end2, BinaryFunction f, Compare comp = Compare()) { while (begin1 != end1 && begin2 != end2) { if (comp(*begin1, *begin2)) { ++begin1; } else if (comp(*begin2, *begin1)) { ++begin2; } else { f(*begin1++, *begin2++); } } }