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