Sagen Sie 'string :: operator ==', um mit dem Vergleich am Ende der Zeichenfolge zu beginnen

7

Ist es möglich / (relativ) einfach / std ™ mit dem Vergleich auf der Rückseite eines Strings zu beginnen oder sollte ich dafür eine eigene Funktion schreiben? Es wäre natürlich relativ einfach, aber trotzdem würde ich einer Standardbibliotheksimplementierung jeden Tag vertrauen.

Das Ende der Saite ist fast einzigartig, und die Front ist ziemlich üblich, das ist der einzige Grund, warum ich diese "Optimierung" brauche.

Danke!

    
rubenvb 30.11.2010, 19:50
quelle

6 Antworten

18

Am besten kann ich mir bis jetzt str1.size() == str2.size() && std::equal(str1.rbegin(), str1.rend(), str2.rbegin())

vorstellen     
Steve Jessop 30.11.2010, 19:56
quelle
3

Sie könnten std :: equal in Kombination mit std :: basic_string :: reverse_iterator (rbegin, rend) verwenden.

Es ist jedoch nur relevant, wenn die Strings die gleiche Länge haben (also müssen Sie zuerst die Größen überprüfen) und nur für die Gleichheit der Strings (da der wichtigste Unterschied der letzte sein wird, der beim Iterieren verglichen wird).

Beispiel:

%Vor%     
Cătălin Pitiș 30.11.2010 19:58
quelle
3

Abhängig davon, wie lange die Strings sind (und Ihr Compiler), können Sie besser mit operator== bleiben. In Visual C ++ v10 reduziert sich dieser Wert auf einen memcmp -Aufruf über char_traits::compare , der (wenn optimiert) die Zielbytebereiche in Chunks vergleicht, wahrscheinlich so viele Bytes gleichzeitig wie in ein Register passen (4 / 8 für 32/64-Bit).

%Vor%

Unterdessen macht std::equal (die netteste Alternative) einen byteweisen Vergleich. Weiß jemand, ob dies auf die gleiche Weise optimiert wird, da es sich um umgekehrte Iteratoren handelt? Im besten Fall ist die Ausrichtungsbehandlung komplexer, da der Anfang des Bereichs nicht gut ausgerichtet ist.

%Vor%

Siehe @ greyfades Antwort hier für etwas Farbe auf GCC.

    
Steve Townsend 30.11.2010 20:52
quelle
2

Wenn Sie es zuerst umkehren möchten, würde ich reverse () from vorschlagen, um den String zuerst umzukehren, dann den Vergleich mit string.compare () zu starten oder einen eigenen Algorithmus zu verwenden. Reverse () dauert jedoch eine Weile und ist prozessorintensiv, daher schlage ich vor, dass Sie mit Ihrer eigenen Funktion umgehen. Starten Sie eine Schleife mit i gleich der Zeichenfolge.length (), und zählen Sie dann mit -i zurück und vergleichen Sie.

%Vor%     
LostInTheCode 30.11.2010 19:54
quelle
0

Sie sollten dafür Ihre eigene Funktion schreiben. Du könntest das Gegenteil tun, wie Lost sagt, aber das wäre keine Optimierung, es sei denn, du hättest diese umgekehrte Zeichenkette beibehalten und mehrere Male verglichen. Selbst dann wäre es keine Verbesserung gegenüber dem Schreiben Ihrer eigenen, die einfach die Strings rückwärts dreht.

    
Crazy Eddie 30.11.2010 19:56
quelle
0

Ich sehe zwei Optionen:

  1. Schreiben Sie Ihre eigene Vergleichsfunktion und rufen Sie diese auf.

  2. Schreiben Sie eine Wrapper-Klasse herum std :: string und implementieren Sie operator== , damit die Klasse das gewünschte Verhalten aufweist.

Die zweite ist wahrscheinlich übertrieben.

    
JohnMcG 30.11.2010 20:12
quelle

Tags und Links