Строка не перевернется с помощью reverse_copy

Если у меня есть строка A, равная "abc" и я хочу иметь строку B которая является обращенной формой строки A, почему я не могу использовать reverse_copy() для этого?

std::string A = "abc";
std::string B;

std::reverse_copy(A.begin(), A.end(), B.begin());

std::cout << B << std::endl;  // no output

Можно ли использовать reverse_copy() со строками? reverse() кажется, работает.

Ответы

Ответ 1

string вы пытаетесь скопировать, слишком короткая (нулевая длина). Вы должны сделать это достаточно долго, чтобы принять скопированные данные:

std::string A = "abc";
std::string B;
B.resize(A.size()); // make B big enough

std::reverse_copy(A.begin(), A.end(), B.begin());

std::cout << B << '\n';

В настоящее время вы пишете после конца B вызывая неопределенное поведение.

Другой способ сделать это - использовать специальный итератор std::back_insert_iterator, который std::back_insert_iterator символы в std::back_insert_iterator целевой строки:

std::string A = "abc";
std::string B;

std::reverse_copy(A.begin(), A.end(), std::back_inserter(B));

Функция std::back_inserter() возвращает std::back_insert_iterator для строки, которую вы предоставляете в качестве параметра (или любого контейнера, который реализует push_back(), такого как std::string::push_back()).

Примечание: std :: reverse_copy, вызываемый стандартными итераторами std::string (как в этом примере), будет просто инвертировать единицы кода строки и не обязательно символы (в зависимости от кодировки). Например, строка в UTF-8, содержащая многобайтовые символы, не будет правильно обращена этой функцией, поскольку многобайтовые последовательности также будут обращены, делая их недействительными.

Ответ 2

std::reverse_copy не выделяет место, поэтому ваш код ведет к неопределенному поведению. Либо выделите место заранее:

string A = "abc";
string B;
B.resize(A.size());
reverse_copy(A.begin(),A.end(),B.begin());
cout<<B<<endl;

или используйте std::back_inserter:

string A = "abc";
string B;
reverse_copy(A.begin(),A.end(),std::back_inserter(B));
cout<<B<<endl;

Ответ 3

std::reverse_copy ожидает, что в месте назначения будет предварительно выделено пространство, поэтому вы хотите что-то вроде:

std::string a = "abc";
std::string b(a.size(), ' ');
std::reverse_copy(std::begin(a), std::end(a), std::begin(b);
std::cout << b << "\n";