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 时返回小于零的值,否则返回大于零的值。
否则,当路径的相对部分( relative_path() )在字典序上分别小于、等于或大于 p 的相对部分( p. relative_path ( ) )时,返回小于、等于或大于 0 的值。比较按元素逐项执行,如同通过从 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++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 2936 C++17 直接比较所有路径元素 根名称和根目录分开处理

参见

(C++17) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++17) (until C++20) (C++20)
按字典序比较两个路径
(函数)