C++ C++;std::transform()和toupper()…为什么会失败?
我有两个std::string。我只想,给定输入字符串:C++ C++;std::transform()和toupper()…为什么会失败?,c++,string,stl,transform,C++,String,Stl,Transform,我有两个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::stri
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(), s.begin(), std::toupper);
这就是backinserter的含义:它将元素插入容器中。使用begin(),将迭代器传递给空容器,并修改无效的迭代器
很抱歉-我的编辑干扰了您的评论。我第一次无意中发布了一些错误。我想说,
out.begin()
返回的迭代器在对空字符串进行几次递增后无效。在第一次+
之后是==out.end()
,则下一个增量后的行为未定义
毕竟这是插入迭代器的作用。
在中留出空间,请执行以下操作:
out.resize(s.length());
[编辑]另一个选项是使用此构造函数创建大小正确的输出字符串
std::string out(s.length(),'X');
std::transform
将在字符串的每个字符上应用该函数。对于空字符串,而不是在第一个增量之后,begin()是否立即等于.end(),我猜是因为std::toupper
被一个双参数变量(由locale.h
提供)重载了。我必须显式转换它:std::transform(s.begin(),s.end(),s.begin(),(int(*)(int))std::toupper);
这和(两者都是字符串)有什么区别:std::string s2(s1);std::transform(s2.begin()),s2.end(),s2.begin(),std::toupper);?哦,我刚刚回答了我自己的问题,我想,在第一种情况下,它只是调整字符串的大小。但在第二种情况下,我认为它是等效的?请参见以下内容:(尽管我可能会使用“调整自己大小”来提高速度)
std::string s="hello";
std::string out;
std::transform(s.begin(), s.end(), s.begin(), std::toupper);