C++ std :: transform()和toupper()..为什么这会失败?

siv*_*udh 29 c++ string stl transform

我有2个std :: string.我只是想,给定输入字符串:

  1. 每封信都要大写
  2. 将大写字母分配给输出字符串.

为什么这样有效:

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), std::back_inserter(out), std::toupper);
Run Code Online (Sandbox Code Playgroud)

但这不会(导致程序崩溃)?

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), out.begin(), std::toupper);
Run Code Online (Sandbox Code Playgroud)

因为这有效(至少在相同的字符串上:

  std::string s="hello";
  std::string out;
  std::transform(s.begin(), s.end(), s.begin(), std::toupper);
Run Code Online (Sandbox Code Playgroud)

hrn*_*rnt 43

没有空间out.C++算法不会自动增长其目标容器.您必须自己创建空间,或使用插入适配器.

为了腾出空间out,请执行以下操作:

out.resize(s.length());

[edit]另一种选择是使用此构造函数创建具有正确大小的输出字符串.

std::string out(s.length(), 'X');