可以删除紧跟两个元音的字符串中的所有字符,而无需借助 char 数组,而只使用“字符串”库 ?
例如:
priamo -> iamo
算法应该是:
- 循环字符串,使 for 循环 from
0
tostring.length()-2
以防止溢出 - 将字符对与包含所有元音的 char 数组进行比较
- 使用字符串库中的“擦除”功能删除元音之前的位置
但我不知道如何在没有字符数组的帮助下实现第二点。有什么建议么?
我建议使用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));
他们所说的没有 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;
}