std::filesystem::path::compare - cppreference.com
De cppreference.com
|
|
(1) | (desde C++17) |
|
|
(2) | (desde C++17) |
|
|
(3) | (desde C++17) |
Compara las representaciones léxicas de la ruta de acceso 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(), devuelve un valor menor que cero si has_root_directory() es false y un valor mayor que cero de lo contrario.
De lo contrario devuelve un valor menor que, igual a o mayor que 0 si la porción relativa de la ruta de acceso (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 ejecuta elemento por elemento, como si se iteraran ambas rutas de acceso desde begin() hasta end() y se comparara el resultado de native() para cada elemento.
2) Equivalente a compare(path(str)).
3) Equivalente a compare(path(s)).
Parámetros
| p | - | Una ruta de acceso a comparar. |
| str | - | Una cadena o vista sobre cadena que representa la ruta de acceso con la que comparar. |
| s | - | Una cadena terminada en nulo que representa la ruta de acceso con la que comparar. |
Valor de retorno
Un valor menor que 0 si la ruta de acceso es lexicográficamente menor que la ruta de acceso dada.
Un valor igual a 0 si la ruta de acceso es lexicográficamente igual a la ruta de acceso dada.
Un valor mayor que 0 si la ruta de acceso es lexicográficamente mayor que la ruta de acceso dada.
Excepciones
2-3) Puede lanzar excepciones definidas por la implementación.
Notas
Para comparaciones de dos vías, los operadores binarios pueden ser más adecuados.
Ejemplo
#include <iostream> #include <filesystem> #include <string_view> namespace fs = std::filesystem; void demo(fs::path p1, fs::path p2, std::string_view mensaje) { using std::cout; cout << p1; const int rc = p1.compare(p2); if(rc < 0) cout << " < "; else if(rc > 0) cout << " > "; else cout << " == "; cout << p2 << " \t: " << mensaje << '\n'; } int main() { demo("/a/b/", "/a/b/", "simple"); demo("/a/b/", "/a/b/c", "simple"); demo("/a/b/../b", "/a/b", "no hay conversión canónica"); demo("/a/b", "/a/b/.", "no hay conversión canónica"); demo("/a/b/", "a/c", "las rutas absolutas se ordenan después de las relativas"); }
Salida:
"/a/b/" == "/a/b/" : simple "/a/b/" < "/a/b/c" : simple "/a/b/../b" > "/a/b" : no hay conversión canónica "/a/b" < "/a/b/." : no hay conversión canónica "/a/b/" > "a/c" : las rutas absolutas se ordenan después de las relativas
Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
| ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
|---|---|---|---|
| LWG 2936 | C++17 | Todos los elementos de la ruta de acceso se comparaban directamente | El nombre raíz y el directorio raíz se manejan separadamente. |