Namespaces
Variants

std::filesystem::path:: compare

From cppreference.net
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 Pfades und eines anderen Pfades.

1) Wenn root_name ( ) . native ( ) . compare ( p. root_name ( ) . native ( ) ) ungleich Null ist, wird dieser Wert zurückgegeben.
Andernfalls, falls has_root_directory ( ) ! = p. has_root_directory ( ) , wird ein Wert kleiner als Null zurückgegeben, wenn has_root_directory() false ist, und ein Wert größer als Null andernfalls.
Andernfalls gibt einen Wert zurück, der kleiner, gleich oder größer als 0 ist, wenn der relative Teil des Pfades ( relative_path() ) lexikografisch jeweils kleiner, gleich oder größer als der relative Teil von p ( p. relative_path ( ) ) ist. Der Vergleich wird elementweise durchgeführt, als würde man beide Pfade von begin() bis end() iterieren und das Ergebnis von native() für jedes Element vergleichen.
2) Entspricht compare ( path ( str ) ) .
3) Entspricht compare ( path ( s ) ) .

Inhaltsverzeichnis

Parameter

p - ein Pfad zum Vergleich
str - ein String oder String-View, der einen Pfad zum Vergleich darstellt
s - ein nullterminierter String, der einen Pfad zum Vergleich darstellt

Rückgabewert

Ein Wert kleiner als 0 wenn der Pfad lexikografisch kleiner als der gegebene Pfad ist.

Ein Wert gleich 0 wenn der Pfad lexikographisch gleich dem gegebenen Pfad ist.

Ein Wert größer als 0 wenn der Pfad lexikografisch größer als der angegebene Pfad ist.

Ausnahmen

2,3) Kann implementierungsdefinierte Ausnahmen werfen.

Hinweise

Für Zwei-Wege-Vergleiche können binäre Operatoren besser geeignet sein.

Beispiel

#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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
LWG 2936 C++17 verglich alle Pfadelemente direkt Root-Name und Root-Verzeichnis separat behandelt

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
(Funktion)