2017-01-13 10 views
1

おはようございます、数日前、私は思っています。私は解決策を見つけることができません。文字列の複数の文字を変更するC++

文字列クラス内で複数の文字を変更する必要があります。

私は置換機能を使用しようとしましたが、文字を置き換えるだけです。

例:

元の文字列: "はいはいペペ、COM VAラビーダ"

それは *

H交換するための文字を入力し AEIOU を交換するcaractersを入力してください* l * P * p *、c * mv * l * v * d *

ありがとうございます。

+3

上記のように例えば

#include <iostream> #include <string> #include <set> #include <algorithm> int main() { std::string s("Hola Pepe, com va la vida"); std::set<char> t({ 'a', 'e', 'i', 'o', 'u' }); char c = '*'; std::cout << s << std::endl; std::replace_if(s.begin(), s.end(), [&t](char c) { return t.count(c); }, c); std::cout << s << std::endl; } 

プログラムの出力は同じですか? – alexeykuzmin0

+1

これまでに試したことをお見せしてください。コード作成サービスではないので、http://stackoverflow.com/help/how-to-askとhttp://stackoverflow.com/help/mcveを参照してください。 –

+0

@Kinyu 96使用方法find_first_of –

答えて

5

私はあなたが欲しいものを行うための最も読みやすい方法を言うと思いますがstd::transformを使用している:ここでは

#include <algorithm> 
... 
std::set<char> vowels = {'a', 'o', 'e', 'i', 'u'}; 
char change_to = '*'; 
std::string s = "Hola Pepe, com va la vida"; 
auto transformation_operation = [vowels, change_to](char c) 
{ 
    return vowels.count(c) ? change_to : c; 
}; 
std::transform(s.begin(), s.end(), s.begin(), transformation_operation); 

transformation_operationは、実際(の形で実装することができるのが望ましい方法で、1つの文字を変換ラムダでありますあなたが望むならば、関数やクラス)。これを行うには、キャプチャされたvowelsと文字change_toのセットを使用します。さらに詳細を追加するために、文字がvowelsセットに存在するかどうかをチェックし、存在する場合はchange_toを返します。そうでない場合は元の文字を返します。

std::transformコール代わりに、つまり、s.begin()始まる結果を格納s.begin()からs.end()各要素について、このラムダ。

0

std::stringの方法find_first_ofを使用することをお勧めします。

標準的なアルゴリズムを使用するように、私はこのケースで最も適切なアルゴリズムがstd::replace_ifであると思われる場合の例

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string s("Hola Pepe, com va la vida"); 
    std::string t("aeiou"); 
    char c = '*'; 

    std::cout << s << std::endl; 

    for (std::string::size_type pos = 0; 
     (pos = s.find_first_of(t, pos)) != std::string::npos; 
     ++pos) 
    { 
     //s.replace(pos, 1, 1, c); 
     s[pos] = c; 
    } 

    std::cout << s << std::endl; 
} 

ためのプログラム出力は

Hola Pepe, com va la vida 
H*l* P*p*, c*m v* l* v*d* 

です。理由だけではなく、すべての文字列を反復処理し、必要に応じて文字を変更しないでください

Hola Pepe, com va la vida 
H*l* P*p*, c*m v* l* v*d* 
+1

'std :: find_first_of'を使った解決策は、大きな文字列ではパフォーマンスが悪くなります – alexeykuzmin0

+0

@ alexeykuzmin0大きな文字列の場合、私の答えで示したようにstd :: replace_ifを使うことができます。 –

関連する問題