可以删除紧跟着两个元音的字符串的所有字符,而不使用char数组,而只使用“字符串”库?
例如:
priamo -> iamo
算法应该是:
0
到string.length()-2
的for循环的字符串以防止溢出但我不知道如何在没有字符数组的帮助下实现第二点。有什么建议吗?
答案 0 :(得分: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));
答案 1 :(得分: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;
}