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 就非常简单了。