std::lexicographical_compare_three_way 范围
std::lexicographical_compare_three_way for ranges
为什么有std::lexicographical_compare_three_way
,没有std::ranges::lexicographical_compare_three_way
?
std::ranges::lexicographical_compare
中有参数 Comp,但它是相当无用的,因为函数 returns bool
,当需要比较类别类型之一时。
这里有一些指向 cppref 的链接
https://en.cppreference.com/w/cpp/algorithm/lexicographical_compare_three_way
https://en.cppreference.com/w/cpp/algorithm/ranges/lexicographical_compare
Why is there std::lexicographical_compare_three_way
, but no std::ranges::lexicographical_compare_three_way
?
std::ranges
中的算法受 concept
约束,而 std
中的算法不受约束。因此,例如,std::ranges::lexicographical_compare
(使用双向比较,默认为 <
)指定为:
template<input_range R1, input_range R2, class Proj1 = identity,
class Proj2 = identity,
indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>,
projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
constexpr bool
lexicographical_compare(R1&& r1, R2&& r2, Comp comp = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
值得注意的是,我们有概念 indirect_strict_weak_order
来解释您需要的比较操作的句法和语义要求,以便使该算法有意义。
然而,还没有人(还)完成制定相应的 concept
用于三向比较的工作。请注意,strict_weak_order
具有非常强的语义要求,我们需要等效于假设的 strict_weak_order_three_way
(或其他不那么糟糕的名称)。
这里有趣的是我们需要而不是拒绝partial_ordering
,而只需要域中没有两个元素比较为partial_ordering::unordered
.
一旦我们有了这样的 concept
,那么指定和实施 std::ranges::lexicographical_compare_three_way
就非常简单了。
为什么有std::lexicographical_compare_three_way
,没有std::ranges::lexicographical_compare_three_way
?
std::ranges::lexicographical_compare
中有参数 Comp,但它是相当无用的,因为函数 returns bool
,当需要比较类别类型之一时。
这里有一些指向 cppref 的链接
https://en.cppreference.com/w/cpp/algorithm/lexicographical_compare_three_way
https://en.cppreference.com/w/cpp/algorithm/ranges/lexicographical_compare
Why is there
std::lexicographical_compare_three_way
, but nostd::ranges::lexicographical_compare_three_way
?
std::ranges
中的算法受 concept
约束,而 std
中的算法不受约束。因此,例如,std::ranges::lexicographical_compare
(使用双向比较,默认为 <
)指定为:
template<input_range R1, input_range R2, class Proj1 = identity,
class Proj2 = identity,
indirect_strict_weak_order<projected<iterator_t<R1>, Proj1>,
projected<iterator_t<R2>, Proj2>> Comp = ranges::less>
constexpr bool
lexicographical_compare(R1&& r1, R2&& r2, Comp comp = {},
Proj1 proj1 = {}, Proj2 proj2 = {});
值得注意的是,我们有概念 indirect_strict_weak_order
来解释您需要的比较操作的句法和语义要求,以便使该算法有意义。
然而,还没有人(还)完成制定相应的 concept
用于三向比较的工作。请注意,strict_weak_order
具有非常强的语义要求,我们需要等效于假设的 strict_weak_order_three_way
(或其他不那么糟糕的名称)。
这里有趣的是我们需要而不是拒绝partial_ordering
,而只需要域中没有两个元素比较为partial_ordering::unordered
.
一旦我们有了这样的 concept
,那么指定和实施 std::ranges::lexicographical_compare_three_way
就非常简单了。