Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;std::transform()和toupper()…为什么会失败?_C++_String_Stl_Transform - Fatal编程技术网

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

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。我只想,给定输入字符串:

  • 每个字母大写
  • 将大写字母指定给输出字符串
  • 这是怎么回事:

      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中没有空间。C++算法不会自动增长目标容器。您必须自己制作空间,或者使用插入适配器。< /P> 要在
    中留出空间,请执行以下操作:

    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);