C++ std:: transform() и toupper().почему это не удается?
у меня есть 2 std::string. Я просто хочу, учитывая входную строку:
- использовать каждую букву
- назначьте заглавную букву выходной строке.
как это работает:
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
но это не (приводит к сбою программы)?
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), out.begin(), std::toupper);
потому что это работает (по крайней мере на одну и ту же строку:
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
3 ответов
нет места в out
. Алгоритмы C++ не увеличивают свои целевые контейнеры автоматически. Вы должны или сделать космос самостоятельно, или использовать переходнику inserter.
чтобы освободить место в out
сделайте так:
out.resize(s.length());
[edit] другой вариант-создать выходную строку с правильным размером с помощью этого конструктора.
std::string out(s.length(), 'X');
Я бы сказал, что iterator, возвращенный out.begin()
недопустимо после нескольких приращений для пустой строки. После первого ++
это ==out.end()
, тогда поведение после следующего приращения не определено.
после всего этого именно для чего нужен insert iterator.
вот смысл backinserter: это вставка элементы в контейнер. используя begin (), вы передаете итератор в пустой контейнер и изменяете недопустимые итераторы.
извините - мои правки мешали вашим комментариям. Сначала я случайно опубликовал что-то неправильное.