Какой самый идиоматический способ преобразования набора целых чисел в набор диапазонов?
например. учитывая набор {0, 1, 2, 3, 4, 7, 8, 9, 11} Я хочу получить {{0,4}, {7,9}, {11,11}}.
Скажем, мы преобразуем из std::set<int>
в std::vector<std::pair<int, int>>
.
Я рассматриваю диапазоны как включенные с обеих сторон, так как это более удобно в моем случае, но я также могу работать с диапазонами с открытым контуром, если это необходимо.
Я написал следующую функцию, но я чувствую, как изобретать колесо. Пожалуйста, скажите, может быть, что-то в STL или повысить для этого.
typedef std::pair<int, int> Range;
void setToRanges(const std::set<int>& indices, std::vector<Range>& ranges)
{
Range r = std::make_pair(-INT_MAX, -INT_MAX);
BOOST_FOREACH(int i, indices)
{
if (i != r.second + 1)
{
if (r.second >= 0) ranges.push_back(r);
r.first = i;
}
r.second = i;
}
ranges.push_back(r);
}