std::filesy...th::compare(3)
okay so bestie, this is the tea on std::filesystem::path::compare(3) from the C++ Standard Libary β the page header is out here looking like std::filesy...th::compare(3) because columns are literally fighting for their life, but we move π
π NAME π
std::filesystem::path::compare β std::filesystem::path::compare
β¨ Synopsis β¨
int compare( const path& p ) const noexcept; (1)
(since C++17)
int compare( const string_type& str ) const; (2)
(since C++17)
int compare( std::basic_string_view<value_type> str ) const;
int compare( const value_type* s ) const; (3)
(since C++17)
It compares the lexical representations of the path and another path, no cap.
- If
root_name().native().compare(p.root_name().native())is nonzero, it returns that value.
Otherwise, if has_root_directory() != p.has_root_directory(), it returns a value less than zero if has_root_directory() is false and a value greater than zero otherwise.
Otherwise, it returns a value less than, equal to or greater than 0 if the relative portion of the path (relative_path()) is respectively lexicographically less than, equal to or greater than the relative portion of p (p.relative_path()). Comparison is performed element-wise, as if by iterating both paths from begin() to end() and comparing the result of native() for each element.
- Equivalent to
compare(path(str)). - Equivalent to
compare(path(s)).
πΈ Parameters πΈ
pβ a path to compare tostrβ a string or string view representing path to compare tosβ a null-terminated string representing path to compare to
β Return value β
- A value less than
0if the path is lexicographically less than the given path. - A value equal to
0if the path is lexicographically equal to the given path. - A value greater than
0if the path is lexicographically greater than the given path.
π«Ά Exceptions π«Ά
2,3) May throw implementation-defined exceptions.
bestie, those are implementation-defined, so donβt act surprised if your standard library has opinions π
π¦ Notes π¦
For two-way comparisons, binary operators may be more suitable.
π§ͺ Example π§ͺ
Run this code, bestie:
#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");
}
π₯οΈ Output π₯οΈ
"/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
π©Ή Defect reports π©Ή
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
- DR:
LWG 2936- Applied to:
C++17 - Behavior as published: compared all path elements directly
- Correct behavior: root name and root directory handled separately
- Applied to:
π See also π
All of these are the lexicographically compares two paths (function) besties:
operator==β (C++17)operator!=β (C++17)(until C++20)operator<β (C++17)(until C++20)operator<=β (C++17)(until C++20)operator>β (C++17)(until C++20)operator>=β (C++17)(until C++20)operator<=>β (C++20)
mwah π sourced from http://cppreference.com, version/date 2024.06.10, and the footer is out here serving std::filesy...th::compare(3). Bye bestie! π
π¦ where this page comes from
- nixpkgs unstable: stdman 2024.07.05
- opensuse-leap 16.0: stdman 2024.07.05-bp160.1.9 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms