2016-04-20 7 views
2

charを取るためにラムダを定義する方法はstring iteratorですか?以下のコードでは、detect_bracketは入力パラメータxに問題があります。`char`引数を取るためのlambda

私はALLの角かっこを始まりと終わりに削除したくありません。

auto detect_bracket = [](char* x){ return(')' == x || '(' == x);}; 

this->str.erase(std::remove_if(str.begin(), str.begin(), 
      detect_bracket) 
); 
this->str.erase(std::remove_if(str.back(), str.back(), 
      detect_bracket) 
); 
+0

'[](char x){return( ')' == x || '(' == x);} 'で十分ではありませんか? – 101010

+0

@ 101010 '/usr/include/c++/4.8/bits/stl_algo.h: '_FIter std :: remove_if(_FIter、_FIter、_Predicate)のインスタンス化では、[_FIter = char; _Predicate = ExprContainer :: removeBrackets():: __ lambda0] ': ../src/CMEXPR.cpp:194:20:ここから必要 /usr/include/c++/4.8/bits/stl_algo.h:1150:25 :エラー:unary '*'( 'char'を持つ)の無効な型引数 ' –

+0

は' char * 'ではなく' char'です。 – 101010

答えて

4

述語関数の署名が直接要素をチェックすることになっているので、あなたは、std::remove_ifとラムダのパラメータの型としてcharを取る必要があります。

auto detect_bracket = [](char x){ return(')' == x || '(' == x);}; 
this->str.erase(std::remove_if(str.begin(), str.end(), 
     detect_bracket) 
); 

std::string::back()std::remove_ifでは動作しません。 charを返し、std::remove_ifはイテレータで表される範囲を返します。あなただけの開始と終了、あなたは可能性が

auto detect_bracket = [](char x){ return(')' == x || '(' == x);}; 
if (!this->str.empty()) { 
    this->str.erase(std::remove_if(str.begin(), str.begin() + 1, detect_bracket), str.begin() + 1); 
} 
if (!this->str.empty()) { 
    this->str.erase(std::remove_if(str.end() - 1, str.end(), detect_bracket), str.end()); 
} 

std::remove_ifが返されますので、我々は、std::string::eraseの正しい終了イテレータを指定する必要があります注要素を削除したい場合は

そしてstr.begin(), str.begin()は、単に空の範囲であります何も見つからなかったとしてもイテレータは、charは間違って消去されます。

template< class ForwardIt, class UnaryPredicate > 
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPredicate p); 

p - unary predicate which returns ​ true if the element should be removed. The signature of the predicate function should be equivalent to the following:

bool pred(const Type &a); 

The type Type must be such that an object of type ForwardIt can be dereferenced and then implicitly converted to Type. ​

必要なのはchar*からcharにあなたの関数のパラメータを変更することです:

LIVE

+1

' str.begin )、str.end() ' – Muggen

+0

文字列から* ALL *カッコを削除する必要はありません。 –

+2

@CronAcronis 'str.begin()、str.begin()'は空の範囲なので何も削除しません。あなたは 'str.begin()、str.begin()+ 1'、' str.rbegin()、str.rbegin()+ 1'がほしいかもしれません。 – songyuanyao

0

remove_iferaseの呼び出しは、とにかくstringを変更/無効にしています。単純に新しいstringを作成し、0番目の場所または1番目の場所のソース文字列を条件付きで割り当てるのはなぜですか?そして、assign最後または最後の文字まで、条件付き

string target; 
target.assign(source.begin() + skip_if_bracket_at_begin, 
    source.end() - skip_if_bracket_at_end); 
関連する問題