🧩 std::rotate_copy — зачем нужна копия, если есть rotate?



std::rotate_copy существует не для удобства — он закрывает конкретный случай, когда мутация исходника недопустима, но выделять промежуточный буфер вручную неудобно.

std::vector<int> src = {1, 2, 3, 4, 5};
std::vector<int> dst(src.size());

std::rotate_copy(src.begin(), src.begin() + 2, src.end(), dst.begin());
// src: {1, 2, 3, 4, 5} — не тронут
// dst: {3, 4, 5, 1, 2}

🔍 Под капотом:

rotate_copy — это ровно два вызова std::copy:

auto out = std::copy(middle, last, result); // [middle, last) первыми
std::copy(first, middle, out); // [first, middle) следом

Никакой магии. Никаких swap. Просто два последовательных копирования.

⚡ Сложность: O(n) с одним проходом данных, без дополнительной памяти (кроме выходного диапазона).

💡 Когда это важно:

// Параллельная обработка: исходник читается несколькими потоками
std::rotate_copy(src.begin(), pivot, src.end(),
std::back_inserter(result));

⚠️ Диапазоны [first, last) и [result, ...) не должны перекрываться — иначе поведение не определено. В отличие от std::rotate, который работает in-place и перекрытий нет по определению.

❗️rotate_copy — частный случай общего принципа STL: алгоритмы с суффиксом _copy не мутируют исходник и пишут в отдельный output iterator.
Просмотры: 277
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти