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++_String - Fatal编程技术网

C++ 删除字符串中紧跟两个元音的所有字符

C++ 删除字符串中紧跟两个元音的所有字符,c++,string,C++,String,可以删除紧跟着两个元音的字符串的所有字符,而无需字符数组的帮助,只使用“字符串”库 例如: priamo -> iamo 算法应为: 将构成for循环的字符串从0循环到string.length()-2,以防止溢出 将字符对与包含所有元音的字符数组进行比较 使用字符串库中的“擦除”功能删除元音前的位置 但是如果没有字符数组的帮助,我不知道如何实现第二点。有什么建议吗?他们在没有字符数组帮助的情况下说的可能意味着你不能做任何类型的缓冲。您可以使用const char元音[]=“aeiou”

可以删除紧跟着两个元音的字符串的所有字符,而无需字符数组的帮助,只使用“字符串”库

例如:

priamo -> iamo
算法应为:

  • 将构成for循环的字符串从
    0
    循环到
    string.length()-2
    ,以防止溢出
  • 将字符对与包含所有元音的字符数组进行比较
  • 使用字符串库中的“擦除”功能删除元音前的位置

  • 但是如果没有字符数组的帮助,我不知道如何实现第二点。有什么建议吗?

    他们在没有字符数组帮助的情况下说的可能意味着你不能做任何类型的缓冲。您可以使用
    const char元音[]=“aeiou”当然

    好吧,这可能是错误的,但应该给你一个想法和一个基础,让其他人来纠正:

    string str="priamo";
    const char vowels[]="aeiou";
    size_t pos=0;
    size_t vowels_piled_up=0;
    while((pos=str.find_first_of(&vowels[0], pos+vowels_piled_up))!=string::npos)
    {
      if((pos+1)+1 >= str.size())//break if it is on the last 2
         break;
      if((strchr(&vowels[0], str[pos+1]))!=NULL)
      {
         str.erase(vowels_piled_up, pos-1-vowels_piled_up);
         pos=0;
         vowels_piled_up+=2;
      }
      else
         ++pos;
    }
    
    我建议使用:


    @chris在
    aeee
    案例中,算法应该给我
    ee
    递归擦除一对元音前的字符,从零位置检查。当然,不使用字符数组的情况下“比较字符对和字符数组”是很棘手的。这些要求是从哪里来的?@Tolga,你学习了就可以做到。至于这个问题,字符串有一个擦除方法,所以XXXXXXXXXXXXXXXX aa应该变成aa?这很容易做到:找到最右边的一对元音,然后删除它们左边的所有内容。如果
    const char[]
    不可接受,
    const std::string元音(“aeiou”)
    也会玩同样的游戏注意“元音”的定义取决于语言。“y”可以被视为一个元音,就像许多其他重音版本一样,可以被视为是不同的。@EmilioGaravaglia——没错,但对于初学者来说,我认为添加复杂的语言环境处理不是一个好主意。我可以看出这并不包括两个元音在擦除操作后直接出现在前面的情况。i、 e.priaeamo=>ia ea mo=>str.earse(2,-1)。他们可能不在乎,但这将重复搜索
    s
    中的每个字符,以查看它是否是元音n-1次。你应该使用
    any_of
    而不是
    find(…)!=结束
    @Dave nice,谢谢,关于重复搜索-为性能改进留出空间总是很好的。设置擦除时的小错误:代码检查
    it
    是否没有指向字符串的开头,然后将其递减2。如果
    it
    等于
    s.cbegin()+1
    ,这将产生一个垃圾值。@但PeteBecker不能<代码>标准::相邻的查找将永远不会返回
    prev(last)
    std::string s{"priamo"};
    auto is_vowel = [](char c) -> bool {
        static const char vowels[] = "aeiou";
        return std::any_of(std::begin(vowels), std::prev(std::end(vowels)),
            [c](char d) { return c == d; } );
    };
    auto it = std::adjacent_find(s.crbegin(), s.crend(),
        [&](char c, char d) { return is_vowel(c) && is_vowel(d); }).base();
    if (it != s.cbegin())
        s.erase(s.cbegin(), std::prev(it, 2));