Entfernen Sie alle Kommata, Punkte und Kleinbuchstaben die Zeichenfolge mit einer einzigen Iteration

8

In meiner C ++ Anwendung muss ich alle dots, commas, exclamation marks entfernen und die Zeichenfolge klein schreiben. Bisher habe ich herausgefunden, dass ich es mit std::erase und std::remove so machen kann:

%Vor%

Also meine Frage ist, kann ich dies tun, ohne 4 mal durch die Zeichenfolge zu iterieren? Gibt es bessere Möglichkeiten, dies mit einfachem C ++ zu tun?

    
Deepsy 26.04.2014, 21:43
quelle

4 Antworten

11

Wenn Iterationen in std::remove und erase ignoriert werden (was Sie bereits tun), können Sie std::remove_if verwenden und ein eigenes benutzerdefiniertes Prädikat angeben:

%Vor%

Dann können Sie std::transform verwenden, um die verbleibende Zeichenfolge in Kleinbuchstaben umzuwandeln:

%Vor%     
juanchopanza 26.04.2014, 21:46
quelle
2

Versuchen Sie es

%Vor%     
Ed Heal 26.04.2014 21:56
quelle
1

Das klingt wie eine bedingte std::transform , also könntest du:

%Vor%

Verwendung in diesem Fall wäre:

%Vor%     
Blastfurnace 26.04.2014 22:37
quelle
1

Wenn Sie dies in einem einzigen Durchlauf tun möchten, ist das mit einer normalen for -Schleife ganz einfach. Die Verwendung von Standard-Bibliotheksroutinen mag im Allgemeinen bevorzugt sein, aber wenn Sie es in einem einzigen Durchgang machen wollen und es keine gute Anpassung in der Bibliothek gibt, dann sehe ich keinen Schaden darin, nur eine Schleife zu verwenden.

%Vor%

Wenn Sie diese Funktionalität in mehr als einer Geschwindigkeit benötigen und / oder die zu parametrisierenden Ausschlusszeichen oder Umwandlungen benötigen, ist es auch ziemlich einfach, diesen Codeschnipsel in eine Funktion umzuwandeln, die diese Dinge als Argument verwendet.

>

Hier ist zum Beispiel eine Template-Funktion, die den Filter und die Transformation in einem Durchgang durchführt:

%Vor%

Es ist generischer, aber ich bin nicht überzeugt, dass es besser lesbar ist.

Update (29. April 2014)

Ich entschied mich, mit der Idee zu experimentieren, eine benutzerdefinierte filter_iterator<> -Filterung durchzuführen, und als ich frustriert wurde über die Menge an Boilerplate-Code, die ich arbeiten musste, dachte ich mir, ob Boost etwas ähnliches hätte . Sicher genug Boost hat genau diesen Datentyp und ein transform_iterator , die zusammen zusammengesetzt werden können, um die folgende alternative Filter- und Transformationsoperation zu erhalten:

%Vor%

Ich denke, das ist eine ziemlich raffinierte Technik, aber ich denke immer noch, es könnte schwer sein zu argumentieren, dass es auf den ersten Blick verständlich ist, was vor sich geht.

    
Michael Burr 26.04.2014 22:31
quelle

Tags und Links