Sie sollten mit std::remove_if
, char
als Parametertyp des Lambda nehmen, da die Signatur der Prädikatfunktion soll direkt das Element überprüfen.
auto detect_bracket = [](char x){ return(')' == x || '(' == x);};
this->str.erase(std::remove_if(str.begin(), str.end(),
detect_bracket)
);
Hinweis std::string::back()
nicht mit std::remove_if
arbeiten. Es wird eine char
zurückgegeben und std::remove_if
erwartet einen Bereich durch Iterator ausgedrückt.
Und str.begin(), str.begin()
ist nur ein leerer Bereich, wenn Sie nur an Element entfernen möchten, die beginnen und enden, könnten Sie
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());
}
Hinweis wir das richtige Ende Iterator für std::string::erase
, angeben müssen, weil std::remove_if
zurückkehren ein Iterator, auch wenn es nichts gefunden hat, und dann wird der Char falsch gelöscht.
LIVE
'[] (char x) {return (')' == x || '(' == x);} 'ist nicht ausreichend? – 101010
@ 101010 '/usr/include/c++/4.8/bits/stl_algo.h: In Instantiierung von '_FIter std :: remove_if (_FIter, _FIter, _Predicate) [mit _FIter = char; _Predicate = ExprContainer :: removeBrackets() :: __ lambda0] ': ../src/CMEXPR.cpp:194:20: erforderlich von hier /usr/include/c++/4.8/bits/stl_algo.h:1150:25 : error: ungültiger Typ Argument von unary '*' (hab 'char') ' –
nicht' char * ', sondern' char'. – 101010