Set Union
template <class I1, class I2, class I3>
void g_set_union
(I1 b1, I1 e1, I2 b2, I2 e2, I3 d)
// range3 = range1 union range2
{
while (b1 != e1 && b2 != e2)
{
if (*b1 < *b2)
{
*d = *b1;
++b1;
}
else if (*b2 < *b1)
{
*d = *b2;
++b2;
}
else // (*b1 == *b2): only 1 copy
{
*d = *b1;
++b1;
++b2;
}
++d;
}
while (b1 != e1)
{
*d++ = *b1++;
}
while (b2 != e2)
{
*d++ = *b2++;
}
}
|
Set Merge
template <class I1, class I2, class I3>
void g_set_merge
(I1 b1, I1 e1, I2 b2, I2 e2, I3 d)
// range3 = range1 merge range2
{
while (b1 != e1 && b2 != e2)
{
if (*b2 < *b1)
{
*d = *b2;
++b2;
}
else // (*b1 <= *b2): favor range 1
{
*d = *b1;
++b1;
}
++d;
}
while (b1 != e1)
{
*d++ = *b1++;
}
while (b2 != e2)
{
*d++ = *b2++;
}
}
|