我有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);
答案 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(),将迭代器传递给空容器并修改无效的迭代器。
对不起 - 我的编辑干扰了你的评论。我第一次意外地发错了。