std::rotate же! На самом деле полезная вещь. Можно что-то, какие-то
записи, которые удобно потом видеть в памяти непрерывным блоком,
обычно текст, писать в кольцевой буфер. А потом сделать rotate
всего буфера и получить набор данных который начинается строго в
начале буфера (на самой старой не перезаписанной поверх другими
записи) и кончается где-то незадолго до конца. Ну и с тремя переменными тоже работает... Вон там swap как раз в середине.
template <class ForwardIterator>
void rotate (ForwardIterator first, ForwardIterator middle, ForwardIterator last)
{
ForwardIterator next= middle;
while (first != next)
{
swap (*first++, *next++);
if(next == last)
next= middle;
else if (first==middle)
middle= next;
}
}
https://en.cppreference.com/w/cpp/algorithm/rotate