Как реализовать циклический сдвиг слова в C++

Допустим имеется слово "элемент"(слово может быть любым), нужно циклически сдвинуть слово вправо на "n" символов. Например, на 3 символа - получим "ентэлем". Как реализовать данную операцию?


Ответы (2 шт):

Автор решения: Vladimir Gamalyan

Разбиваете строку на два куска и собираете из них новую строку (правый кусок соединяем с левым), пример (для простоты использования русских буков используется std::u32string):

#include <iostream>
#include <string>
#include <codecvt>
#include <locale>

int main(int argc, char* argv[]) {
    std::u32string str = U"элемент";
    int n = 4;
    std::u32string result = str.substr(n) + str.substr(0, n);
    
    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter;
    std::cout << converter.to_bytes(result) << std::endl;
}

https://wandbox.org/permlink/ttBzGaWz1s7ykE50

З.Ы. Идеологически более корректно будет использовать rotate из ответа Harry

→ Ссылка
Автор решения: Harry

Если у вас С++ - не преумножайте сущности сверх необходимости - воспользуйтесь обычным rotate из стандартной библиотеки...

string s = "элемент";
rotate(s.begin(),s.begin()+(s.length()-3),s.end());
cout << s;

См. https://ideone.com/sHRzfU

Если использовать стандартные функции запрещено - используйте метод двойного реверса.

→ Ссылка