std::filesystem::path::compare
Von cppreference.com
< cpp | filesystem | path
| int compare( const path& p ) const noexcept; |
(1) | (seit C++17) |
| int compare( const string_type& str ) const; int compare( std::basic_string_view<value_type> str ) const; |
(2) | (seit C++17) |
| int compare( const value_type* s ) const; |
(3) | (seit C++17) |
Vergleicht die lexikalischen Darstellungen des Pfads und eines anderen Pfads.
1) Wenn root_name().native().compare(p.root_name().native()) ungleich Null ist, wird dieser Wert zurückgegeben.
Andernfalls, wenn has_root_directory() != p.has_root_directory(), wird ein Wert kleiner als Null zurückgegeben, wenn
has_root_directory() false ist, und andernfalls ein Wert größer als Null. Andernfalls wird ein Wert zurückgegeben, der kleiner als, gleich oder größer als 0 ist, wenn der relative Teil des Pfads (
relative_path()) entsprechend lexikalisch kleiner, gleich oder größer ist als der relative Teil von p (p.relative_path()). Der Vergleich wird elementweise durchgeführt, als ob beide Pfade von begin() bis end() iteriert und das Ergebnis von native() für jedes Element verglichen würde.2) Äquivalent zu compare(path(str)).
3) Äquivalent zu compare(path(s)).
Inhalt |
[edit] Parameter
| p | - | ein zu vergleichender Pfad |
| str | - | eine Zeichenkette oder ein Zeichenketten-View, der den zu vergleichenden Pfad repräsentiert |
| s | - | eine nullterminierte Zeichenkette, die den zu vergleichenden Pfad repräsentiert |
[edit] Rückgabewert
Ein Wert kleiner als 0, wenn der Pfad lexikalisch kleiner als der gegebene Pfad ist.
Ein Wert gleich 0, wenn der Pfad lexikalisch gleich dem gegebenen Pfad ist.
Ein Wert größer als 0, wenn der Pfad lexikalisch größer als der gegebene Pfad ist.
[edit] Ausnahmen
2,3) Kann implementierungsdefinierte Ausnahmen auslösen.
[edit] Hinweise
Für Zwei-Wege-Vergleiche sind die binären Operatoren möglicherweise besser geeignet.
[edit] Beispiel
Führen Sie diesen Code aus
#include <filesystem> #include <iostream> #include <string_view> namespace fs = std::filesystem; void demo(fs::path p1, fs::path p2, std::string_view msg) { std::cout << p1; const int rc = p1.compare(p2); if (rc < 0) std::cout << " < "; else if (rc > 0) std::cout << " > "; else std::cout << " == "; std::cout << p2 << " \t: " << msg << '\n'; } int main() { demo("/a/b/", "/a/b/", "simple"); demo("/a/b/", "/a/b/c", "simple"); demo("/a/b/../b", "/a/b", "no canonical conversion"); demo("/a/b", "/a/b/.", "no canonical conversion"); demo("/a/b/", "a/c", "absolute paths order after relative ones"); }
Ausgabe
"/a/b/" == "/a/b/" : simple "/a/b/" < "/a/b/c" : simple "/a/b/../b" > "/a/b" : no canonical conversion "/a/b" < "/a/b/." : no canonical conversion "/a/b/" > "a/c" : absolute paths order after relative ones
[edit] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 2936 | C++17 | alle Pfadelemente direkt verglichen | Root-Name und Root-Verzeichnis separat behandelt |
[edit] Siehe auch
| (C++17)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++17)(bis C++20)(C++20) |
vergleicht zwei Pfade lexikographisch (function) |