Ich möchte die erste und letzte Klammer entfernen, die durch Referenzzeichenfolge übergeben werden. Leider habe ich Schwierigkeiten, die ersten und letzten Elemente bedingt zu entfernen. Ich kann nicht verstehen, warum remove_if
nicht funktioniert, wie ich mit Iteratoren erwarte.remove_if letztes Zeichen aus einer Zeichenkette
#include <iostream>
#include <algorithm>
using namespace std;
void print_wo_brackets(string& str){
auto detect_bracket = [](char x){ return(')' == x || '(' == x);};
if (!str.empty())
{
str.erase(std::remove_if(str.begin(), str.begin() + 1, detect_bracket));
}
if (!str.empty())
{
str.erase(std::remove_if(str.end()-1, str.end(), detect_bracket));
}
}
int main()
{
string str = "abc)";
cout << str << endl;
print_wo_brackets(str);
cout << str << endl;
string str2 = "(abc";
cout << str2 << endl;
print_wo_brackets(str2);
cout << str2 << endl;
return 0;
}
Ausgabe
abc)
ac <- HERE I expect abc
(abc
abc
Diese Antwort kann nützlich sein (auch andere Antworten können passen) http://StackOverflow.com/a/25385766/3807729 – Galik
Grundsätzlich remove_if ändert nicht die Größe des Containers. Stattdessen gibt es das neue Ende zurück. Sie müssen die Zeichenfolge manuell aktualisieren, um die Änderung widerzuspiegeln. Wenn Sie das erste Zeichen verwenden, wird die Saite wahrscheinlich durcheinander gebracht. –