Wie ändere ich die Sortierreihenfolge von Unterstrichen in AWL?

8

Ich habe eine C ++ - Anwendung, die einen STL-Satz verwendet, um eine Liste von Strings (geordnet und eindeutig) zu behalten.

Das Problem, das ich habe, ist, dass Unterstreichungen in der entgegengesetzten Weise angeordnet werden, wie ich sie brauche.

Beispiel AWL-Reihenfolge:

%Vor%

Die Reihenfolge, die ich brauche, ist:

%Vor%

Ich habe begonnen, eine benutzerdefinierte Vergleichsfunktion zu implementieren, um dieses Problem zu beheben, aber ich würde lieber eine Lösung verwenden, die in STL bereitgestellt wird (falls vorhanden).

Bei der Online-Suche habe ich einige Verweise auf genau dieses Problem gefunden, aber in anderen Systemen, und die Lösung scheint darin zu bestehen, die Sortierung oder das Gebietsschema zu ändern, aber ich finde nicht, wie man das mit STL macht .

    
Paulo Pinto 17.11.2011, 20:01
quelle

4 Antworten

3

Sie können std::lexicographic_compare mit einem benutzerdefinierten Prädikat verwenden, um Zeichenfolgen mit einer benutzerdefinierten Zeichenreihenfolge zu vergleichen - wie Gnawme bereits sagte. Der folgende Code führt die std::set mit der std::lexicographic_compare zusammen.

%Vor%     
Christian Ammer 17.11.2011, 21:26
quelle
7

Es gibt keine integrierte Lösung für dieses spezielle Problem, da die Bibliotheken erwarten, dass Sie Ihren eigenen benutzerdefinierten Vergleicher erstellen, um das zu handhaben.

Vielleicht möchten Sie jedoch Ihren eigenen char_traits -Typ definieren, mit dem Sie anpassen können, wie Strings sortiert und verglichen werden. Es gibt zwar nicht die besten Tutorials online, aber dies ist möglicherweise die sauberste und einfachste Lösung für Ihr Problem. Als schamlosen Pfropfen habe ich eine Antwort auf diese frühere Frage geschrieben über char_traits , was für das, was du tust, nützlich sein könnte.

Ich würde vorschlagen, dass Sie sich nicht mit Gebietsschemata herumschlagen. Gebietsschemas sind für die Lokalisierung konzipiert und sollen große, tiefgreifende Auswirkungen auf die Handhabung von Text haben. Ein benutzerdefinierter Vergleicher oder ein neuer char_traits Typ adressiert das Problem direkter.

    
templatetypedef 17.11.2011 20:09
quelle
4

Matt Austern hat einen Artikel über "Wie man die Groß- / Kleinschreibung ohne Berücksichtigung von Groß- und Kleinschreibung vergleicht" geschrieben, der die Gebietsschemata richtig behandelt. Es kann die Informationen zu Locales und Facetten enthalten, nach denen Sie suchen.

Andernfalls, wenn Sie nur die übliche Vergleichsreihenfolge einiger Zeichen ändern möchten, sollten Sie std::lexicographical_compare nicht mit Ihrem eigenen Vergleichsfunktionsobjekt verwenden?

%Vor%

"word0" bewertet im ersten Fall weniger als "word_" und im zweiten Fall größer als das, was Sie suchen.

Wenn Sie bereits etwas Ähnliches machen, ist das der einfachste Weg.

Bearbeiten : Um dies zu erreichen, verwendet Austern in dem Artikel char_traits :

  

Der Standardbibliothekstyp std::string verwendet den Merkmalparameter für   alle Vergleiche, also, indem ein Merkmalsparameter mit Gleichheit und   weniger als neu definiert, können Sie basic_string in instanziieren   So, dass die Operatoren < und == tun, was Sie brauchen. Sie   kann es tun, aber es ist nicht die Mühe wert.

     

Du wirst nicht in der Lage sein, I / O zu machen, zumindest nicht ohne viel Schmerz. Sie   kann normale Stream-Objekte wie cin und cout nicht verwenden.

Er fährt fort, einige andere gute Gründe aufzulisten, warum das Ändern von char_traits , um diesen Vergleich durchzuführen, keine gute Idee ist.

Ich empfehle dringend, dass Sie Austerns Papier lesen.

    
Gnawme 17.11.2011 21:00
quelle
1

Es gibt eine Sammlung und hier ist ein kurze Erläuterungen zur Verwendung von Facetten in C ++ mit ein paar Beispielen, wie es verwendet werden kann.

Aber Sie müssten wahrscheinlich die eigentliche Logik selbst implementieren.

Und: "Die String-Klasse in der Standard-C ++ - Bibliothek bietet keinen Dienst für länderspezifische String-Vergleiche." Daher müssen Sie die Locale-Verwendung auch in eine separate Vergleichsfunktion einfügen.

Wenn also ein existierendes Gebietsschema die Strings nicht so vergleicht, wie Sie es möchten, sieht das so aus wie ein Overkill.

    
UncleBens 17.11.2011 20:20
quelle

Tags und Links