Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::ranges::lexicographical_compare

      From cppreference.com
      <cpp‎ |algorithm‎ |ranges
       
       
      Algorithm library
      Constrained algorithms and algorithms on ranges(C++20)
      Constrained algorithms, e.g.ranges::copy,ranges::sort, ...
      Execution policies(C++17)
      Sorting and related operations
      Partitioning operations
      Sorting operations
      Binary search operations
      (on partitioned ranges)
      Set operations (on sorted ranges)
      Merge operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      (C++11)
      (C++17)
      Lexicographical comparison operations
      Permutation operations
      C library
      Numeric operations
      Operations on uninitialized memory
       
      Constrained algorithms
      All names in this menu belong to namespacestd::ranges
      Non-modifying sequence operations
      Modifying sequence operations
      Partitioning operations
      Sorting operations
      Binary search operations (on sorted ranges)
             
             
      Set operations (on sorted ranges)
      Heap operations
      Minimum/maximum operations
      Permutation operations
      Fold operations
      Operations on uninitialized storage
      Return types
       
      Defined in header<algorithm>
      Call signature
      template<std::input_iterator I1,std::sentinel_for<I1> S1,

               std::input_iterator I2,std::sentinel_for<I2> S2,
               class Proj1=std::identity,class Proj2=std::identity,
               std::indirect_strict_weak_order<
                    std::projected<I1, Proj1>,
                    std::projected<I2, Proj2>> Comp=ranges::less>
      constexprbool
          lexicographical_compare( I1 first1, S1 last1, I2 first2, S2 last2,

                                   Comp comp={}, Proj1 proj1={}, Proj2 proj2={});
      (1)(since C++20)
      template<ranges::input_range R1,ranges::input_range R2,

               class Proj1=std::identity,class Proj2=std::identity,
               std::indirect_strict_weak_order<
                    std::projected<ranges::iterator_t<R1>, Proj1>,
                    std::projected<ranges::iterator_t<R2>, Proj2>> Comp=ranges::less>
      constexprbool
          lexicographical_compare( R1&& r1, R2&& r2, Comp comp={},

                                   Proj1 proj1={}, Proj2 proj2={});
      (2)(since C++20)

      Checks if the first range[first1last1) is lexicographicallyless than the second range[first2last2).

      1) Elements are compared using the given binary comparison functioncomp.
      2) Same as(1), but usesr as the source range, as if usingranges::begin(r) asfirst andranges::end(r) aslast.

      Lexicographical comparison is an operation with the following properties:

      • Two ranges are compared element by element.
      • The first mismatching element defines which range is lexicographicallyless orgreater than the other.
      • If one range is a prefix of another, the shorter range is lexicographicallyless than the other.
      • If two ranges have equivalent elements and are of the same length, then the ranges are lexicographicallyequal.
      • An empty range is lexicographicallyless than any non-empty range.
      • Two empty ranges are lexicographicallyequal.

      The function-like entities described on this page arealgorithm function objects (informally known asniebloids), that is:

      Contents

      [edit]Parameters

      first1, last1 - the iterator-sentinel pair defining the firstrange of elements to examine
      r1 - the first range of elements to examine
      first2, last2 - the iterator-sentinel pair defining the secondrange of elements to examine
      r2 - the second range of elements to examine
      comp - comparison function to apply to the projected elements
      proj1 - projection to apply to the first range of elements
      proj2 - projection to apply to the second range of elements

      [edit]Return value

      true if the first range is lexicographicallyless than the second.

      [edit]Complexity

      At most2·min(N1, N2) applications of the comparison and corresponding projections, whereN1=ranges::distance(first1, last1) andN2=ranges::distance(first2, last2).

      [edit]Possible implementation

      struct lexicographical_compare_fn{template<std::input_iterator I1,std::sentinel_for<I1> S1,std::input_iterator I2,std::sentinel_for<I2> S2,class Proj1=std::identity,class Proj2=std::identity,std::indirect_strict_weak_order<                 std::projected<I1, Proj1>,                 std::projected<I2, Proj2>> Comp=ranges::less>constexprbool operator()(I1 first1, S1 last1, I2 first2, S2 last2,                              Comp comp={}, Proj1 proj1={}, Proj2 proj2={})const{for(;(first1!= last1)&&(first2!= last2);++first1,(void)++first2){if(std::invoke(comp,std::invoke(proj1,*first1),std::invoke(proj2,*first2)))returntrue; if(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1)))returnfalse;}return(first1== last1)&&(first2!= last2);} template<ranges::input_range R1,ranges::input_range R2,class Proj1=std::identity,class Proj2=std::identity,std::indirect_strict_weak_order<                 std::projected<ranges::iterator_t<R1>, Proj1>,                 std::projected<ranges::iterator_t<R2>, Proj2>> Comp=ranges::less>constexprbool operator()(R1&& r1, R2&& r2, Comp comp={},                              Proj1 proj1={}, Proj2 proj2={})const{return(*this)(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2),std::ref(comp),std::ref(proj1),std::ref(proj2));}}; inlineconstexpr lexicographical_compare_fn lexicographical_compare;

      [edit]Example

      Run this code
      #include <algorithm>#include <iostream>#include <iterator>#include <random>#include <vector> int main(){std::vector<char> v1{'a','b','c','d'};std::vector<char> v2{'a','b','c','d'}; namespace ranges= std::ranges;auto os=std::ostream_iterator<char>(std::cout," "); std::mt19937 g{std::random_device{}()};while(not ranges::lexicographical_compare(v1, v2)){ranges::copy(v1, os);std::cout<<">= ";ranges::copy(v2, os);std::cout<<'\n'; ranges::shuffle(v1, g);ranges::shuffle(v2, g);} ranges::copy(v1, os);std::cout<<"<  ";ranges::copy(v2, os);std::cout<<'\n';}

      Possible output:

      a b c d >= a b c dd a b c >= c b d ab d a c >= a d c ba c d b <  c d a b

      [edit]See also

      determines if two sets of elements are the same
      (algorithm function object)[edit]
      returnstrue if one range is lexicographically less than another
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/ranges/lexicographical_compare&oldid=180434"

      [8]ページ先頭

      ©2009-2025 Movatter.jp