Namespaces
Variants

std::filesystem::path:: compare

From cppreference.net
int compare ( const path & p ) const noexcept ;
(1) (desde C++17)
int compare ( const string_type & str ) const ;
int compare ( std:: basic_string_view < value_type > str ) const ;
(2) (desde C++17)
int compare ( const value_type * s ) const ;
(3) (desde C++17)

Compara las representaciones léxicas de la ruta y otra ruta.

1) Si root_name ( ) . native ( ) . compare ( p. root_name ( ) . native ( ) ) es distinto de cero, devuelve ese valor.
De lo contrario, si has_root_directory ( ) ! = p. has_root_directory ( ) , retorna un valor menor que cero si has_root_directory() es false y un valor mayor que cero en caso contrario.
En caso contrario, retorna un valor menor que, igual a o mayor que 0 si la porción relativa de la ruta ( relative_path() ) es respectivamente lexicográficamente menor que, igual a o mayor que la porción relativa de p ( p. relative_path ( ) ). La comparación se realiza elemento por elemento, como si se iteraran ambas rutas desde begin() hasta end() y comparando el resultado de native() para cada elemento.
2) Equivalente a compare ( path ( str ) ) .
3) Equivalente a compare ( path ( s ) ) .

Contenidos

Parámetros

p - una ruta a comparar
str - una cadena o vista de cadena que representa la ruta a comparar
s - una cadena terminada en nulo que representa la ruta a comparar

Valor de retorno

Un valor menor que 0 si la ruta es lexicográficamente menor que la ruta dada.

Un valor igual a 0 si la ruta es lexicográficamente igual a la ruta dada.

Un valor mayor que 0 si la ruta es lexicográficamente mayor que la ruta dada.

Excepciones

2,3) Puede lanzar excepciones definidas por la implementación.

Notas

Para comparaciones bidireccionales, los operadores binarios pueden ser más adecuados.

Ejemplo

#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");
}

Salida:

"/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

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2936 C++17 comparaba todos los elementos de ruta directamente nombre raíz y directorio raíz manejados por separado

Véase también

(C++17) (C++17) (hasta C++20) (C++17) (hasta C++20) (C++17) (hasta C++20) (C++17) (hasta C++20) (C++17) (hasta C++20) (C++20)
compara lexicográficamente dos rutas
(función)