Namespaces
Variants

std::filesystem::path:: compare

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

Сравнивает лексические представления пути и другого пути.

1) Если root_name ( ) . native ( ) . compare ( p. root_name ( ) . native ( ) ) ненулевое, возвращает это значение.
В противном случае, если has_root_directory ( ) ! = p. has_root_directory ( ) , возвращает значение меньше нуля, если has_root_directory() равно false , и значение больше нуля в противном случае.
В противном случае возвращает значение меньше, равное или большее 0 если относительная часть пути ( relative_path() ) соответственно лексикографически меньше, равна или больше относительной части p ( p. relative_path ( ) ). Сравнение выполняется поэлементно, как если бы происходила итерация по обоим путям от begin() до end() с сравнением результата native() для каждого элемента.
2) Эквивалентно compare ( path ( str ) ) .
3) Эквивалентно compare ( path ( s ) ) .

Содержание

Параметры

p - путь для сравнения
str - строка или строковое представление пути для сравнения
s - нуль-терминированная строка, представляющая путь для сравнения

Возвращаемое значение

Значение меньше 0 если путь лексикографически меньше заданного пути.

Значение, равное 0 если путь лексикографически равен заданному пути.

Значение больше 0 если путь лексикографически больше заданного пути.

Исключения

2,3) Может генерировать исключения, определяемые реализацией.

Примечания

Для двусторонних сравнений бинарные операторы могут быть более подходящими.

Пример

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

Вывод:

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

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Применяется к Поведение в опубликованной версии Корректное поведение
LWG 2936 C++17 сравнивались все элементы пути напрямую корневое имя и корневая директория обрабатываются отдельно

Смотрите также

(C++17) (C++17) (до C++20) (C++17) (до C++20) (C++17) (до C++20) (C++17) (до C++20) (C++17) (до C++20) (C++20)
лексикографически сравнивает два пути
(функция)