# std::filesystem::path::compare

< cpp‎ | filesystem‎ | path

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 起)

比较 `path` 与另一 `path` 的字典表示。

1) 若 root_name().native().compare(p.root_name().native()) 非零，则返回该值。
否则若 has_root_directory() != p.has_root_directory() ，则若 `has_root_directory()` 为 false 则返回小于零的值，否则返回大于零的值。
否则返回比较小于、等于或大于 0 的值，若 `path` 的相对部分 (`relative_path()`) 分别按字典序小于、等于或大于 `p` 的相对部分 (p.relative_path()) 。逐元素进行比较，如同从`begin()` 到 `end()` 迭代 `path` 。
2) 等价于 compare(path(str)) 。
3) 等价于 compare(path(s)) 。

### 参数

p | - | 要比较的 `path`
str | - | 表示要比较的表示路径的字符串或字符串视图
s | - | 表示要比较的路径的空终止字符串

### 返回值

若 `path` 按字典序小于给定 `path` 则为小于 0 的值。

若 `path` 按字典序等于给定 `path` 则为等于 0 的值。

若 `path` 按字典序大于给定 `path` 则为大于 0 的值。

### 异常

2-3) 可能抛出实现定义的异常。

### 注解

对于双路比较，二元运算符可能更适合。

### 示例

    #include <iostream>
    #include <filesystem>
    namespace fs = std::filesystem;
    void demo(int rc, fs::path p1, fs::path p2) {
        if(rc < 0) std::cout << p1 << " < " << p2 << '\n';
        else if(rc > 0) std::cout << p1 << " > "  << p2 << '\n';
        else if(rc == 0) std::cout << p1 << " == " << p2 << '\n';
    }
    int main() {
        fs::path p1 = "/a/b/"; // 对于字典序迭代如同 "/a/b"
        fs::path p2 = "/a/b/c";
        demo(p1.compare(p2), p1, p2);
        demo(p1.compare("a/c"), p1, "a/c"); // 绝对路径先序于相对路径
    }

输出：

    "/a/b/" < "/a/b/c"
    "/a/b/" > "a/c"

### 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

DR | 应用于 | 出版时的行为 | 正确行为
--- | --- | --- | ---
LWG 2936 | C++17 | 直接比较所有路径元素 | 分开处理根名与根目录

### 参阅

operator==operator!=operator<operator<=operator>operator>=operator<=> (C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20) | 以字典序比较二个路径 (函数)