Range consolidation: Difference between revisions

Content added Content deleted
m (Efficiency improvement)
m (Efficiency improvement)
Line 317: Line 317:
}
}


// Merges a range of ranges in-place. Returns an iterator to the
// end of the resulting range, similarly to std::remove.
template <typename iterator>
template <typename iterator>
iterator merge_ranges(iterator begin, iterator end) {
iterator merge_ranges(iterator begin, iterator end) {
for (iterator i = begin; i != end; ++i) {
iterator out = begin;
for (iterator i = begin; i != end; ) {
iterator j = i;
iterator j = i;
int count = 0;
while (++j != end && j->first <= i->second)
while (++j != end && j->first <= i->second) {
i->second = std::max(i->second, j->second);
i->second = std::max(i->second, j->second);
++count;
*out++ = *i;
}
i = j;
if (count > 0) {
iterator k = i;
std::move(j, end, ++k);
std::advance(end, -count);
}
}
}
return end;
return out;
}
}