32

我有 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);
4

3 回答 3

48

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

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

out.resize(s.length());

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

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

于 2009-09-28T20:57:48.463 回答
2

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

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

于 2009-09-28T20:57:17.833 回答
0

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

很抱歉 - 我的编辑干扰了您的评论。我第一次不小心发错了。

于 2009-09-28T20:56:34.963 回答