-1

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

例如:

priamo -> iamo

算法应该是:

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

但我不知道如何在没有字符数组的帮助下实现第二点。有什么建议么?

4

2 回答 2

2

我建议使用std::adjacent_find

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));
于 2012-08-15T16:51:58.630 回答
0

他们所说的没有 char 数组的帮助可能意味着你不能做任何缓冲。你当然可以使用const char vowels[]="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;
}
于 2012-08-15T15:57:52.580 回答