Ответ 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, содержащая многобайтовые символы, не будет правильно обращена этой функцией, поскольку многобайтовые последовательности также будут обращены, делая их недействительными.