C++ std:: transform() и toupper().почему это не удается?

у меня есть 2 std::string. Я просто хочу, учитывая входную строку:

  1. использовать каждую букву
  2. назначьте заглавную букву выходной строке.

как это работает:

  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 (), вы передаете итератор в пустой контейнер и изменяете недопустимые итераторы.

извините - мои правки мешали вашим комментариям. Сначала я случайно опубликовал что-то неправильное.