-1

文字配列の助けを借りずに、代わりに「文字列」ライブラリのみを使用して、2 つの母音が直後に続く文字列のすべての文字を削除することができます。

例えば:

priamo -> iamo

アルゴリズムは次のようになります。

  1. オーバーフローを防ぐために for ループ0を作る文字列を循環させるstring.length()-2
  2. 文字のペアを、すべての母音を含む char 配列と比較します
  3. 文字列ライブラリの「消去」機能を使用して、母音の前の位置を削除する

しかし、文字の配列の助けを借りずに 2 番目のポイントを実装する方法がわかりません。助言がありますか?

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 に答える