Как преобразовать диапазон попарно с помощью range-v3?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как преобразовать диапазон попарно с помощью range-v3?

Сообщение Anonymous »

Я пишу алгоритм для удаления перекрытий по заданному диапазону строк (я называю его «линиями» из-за неоднозначности термина «диапазон» в данном случае).

Вот как выглядит строка:

Код: Выделить всё

struct line {
int begin, width;
int end() const { return begin + width; }
};
Пример: Учитывая три строки (0,3), (1,2) и (5,1), я ожидаю получить (0 ,3), (3,2) и (5,1) после преобразования. Вот графическое представление этой проблемы:

Изображение


Это одно из возможных решений проблемы:

Код: Выделить всё

auto removeOverlap(std::pair input)
{
// keeps first line untouched and shifts the second line to the end of the first one, if necessary
return std::pair{std::get(input), {std::max(std::get(input).end(), std::get(input).begin), std::get(input).width}};
}

int main(int argc, char *argv[])
{

std::array lines{{{0,3},{1,2},{5,1}}};
for(int i = 0; i < lines.size()-1; ++i)
{
std::tie(lines[i], lines[i+1]) = removeOverlap(std::make_pair(lines[i], lines[i+1]));
}
assert(lines[0].begin == 0);
assert(lines[1].begin == 3);
assert(lines[2].begin == 5);
Мой вопрос: как я могу сделать это с помощью range-v3?

Я подумываю об использовании модифицированный view::chunk(N), в котором размер приращения равен 1 (вместо N). Но я правда не знаю, как с этой точки зрения поступить.

Подробнее здесь: https://stackoverflow.com/questions/426 ... h-range-v3
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»