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

时间:2009-09-28 20:53:07

标签: c++ string stl transform

我有2个std :: string。我只想给出输入字符串:

  1. 将每个字母大写
  2. 将大写字母分配给输出字符串。
  3. 为什么会这样:

      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 个答案:

答案 0 :(得分:43)

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

要在out中留出空间,请执行以下操作:

out.resize(s.length());

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

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

答案 1 :(得分:2)

我会说out.begin()返回的迭代器在空字符串的几个增量后无效。在第一个++ ==out.end()之后,下一个增量之后的行为是未定义的。

毕竟这正是插入迭代器的用途。

答案 2 :(得分:0)

这就是backinserter的意义:元素插入到容器中。使用begin(),将迭代器传递给空容器并修改无效的迭代器。

对不起 - 我的编辑干扰了你的评论。我第一次意外地发错了。