std::filesystem::path::compare
De cppreference.com
<tbody>
</tbody>
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 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
Ejecuta este código
#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. |
Véase también
(hasta C++20)(hasta C++20)(hasta C++20)(hasta C++20)(hasta C++20)(C++20) |
Compara lexicográficamente dos rutas de acceso. (función) |