std::filesystem::path::compare

来自cppreference.com
< 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 直接比较所有路径元素 分开处理根名与根目录

参阅

(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20 前)(C++20)
以字典序比较二个路径
(函数)