Ответ
В C++ для строки типа std::string самый эффективный и идиоматичный способ — использовать алгоритм std::reverse из стандартной библиотеки. Он выполняет in-place разворот за линейное время O(n) и константную дополнительную память O(1).
#include <algorithm>
#include <string>
#include <iostream>
int main() {
std::string str = "Hello, World!";
std::reverse(str.begin(), str.end());
std::cout << str << std::endl; // Вывод: "!dlroW ,olleH"
return 0;
}
Почему это минимальные затраты:
- Время: O(n) — меньше нельзя, нужно посетить каждый символ.
- Память: O(1) — алгоритм использует два итератора и меняет символы местами, не создавая новую строку.
- Оптимизация: Реализация
std::reverseв стандартной библиотеке часто использует оптимизации для конкретного компилятора.
Для C-строк (массивов char) принцип тот же, но реализуется вручную:
#include <cstring>
void reverse_c_string(char* str) {
if (!str) return;
char* end = str + strlen(str) - 1;
while (str < end) {
std::swap(*str, *end); // или ручной обмен через временную переменную
++str;
--end;
}
}