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) { |
||
iterator out = begin; |
|||
for (iterator i = begin; i != end; ) { |
|||
iterator j = i; |
iterator j = i; |
||
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); |
||
*out++ = *i; |
|||
i = j; |
|||
if (count > 0) { |
|||
iterator k = i; |
|||
std::move(j, end, ++k); |
|||
std::advance(end, -count); |
|||
} |
|||
} |
} |
||
return |
return out; |
||
} |
} |
||