Хотя вы, вероятно, можете достичь того, чего хотите, с помощью std::shift_right
, соответствующий алгоритм для выполнения описанных вами действий - std::rotate
, который вы также можете использовать без C ++ 20:
std::rotate(seq.begin(), seq.end() - 1, seq.end());
Вот демонстрация .
Причина, по которой версия shift_right
не работает, заключается в том, что у вас есть итератор для последнего элемента. Когда вы заканчиваете sh сдвиг, исходный последний элемент перезаписывается, и теперь итератор указывает на сдвинутый элемент. Итак, что вы можете сделать, это сделать копию последнего элемента , а затем поместить его в начало:
int temp = seq.back();
std::shift_right(seq.begin(), seq.end(), 1);
seq[0] = temp;
Вот демонстрация . Но учтите, что это взлом; используйте shift_right
, если вас не волнуют те элементы, которые вы перезаписываете. Если вас волнуют элементы, то rotate
диапазон.