#pragma once #include "std/algorithm.hpp" // Similar to set_difference(), but if element is present n times in the first sequence and once in // the second sequence, all n copies are filtered, insted of one. template OutIterT SetDifferenceUnlimited(Iter1T beg1, Iter1T end1, Iter2T beg2, Iter2T end2, OutIterT out, LessT lessCompare) { while (beg1 != end1 && beg2 != end2) { if (lessCompare(*beg1, *beg2)) { *out = *beg1; ++beg1; ++out; } else if (lessCompare(*beg2, *beg1)) { ++beg2; } else { ++beg1; // This is the difference between set_difference and this function: // In set_difference the commented line should be present. // ++beg2; } } return copy(beg1, end1, out); }