Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::ranges::set_union,std::ranges::set_union_result

      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,
               std::weakly_incrementable O,class Comp=ranges::less,
               class Proj1=std::identity,class Proj2=std::identity>
      requiresstd::mergeable<I1, I2, O, Comp, Proj1, Proj2>
      constexpr set_union_result<I1, I2, O>
          set_union( I1 first1, S1 last1, I2 first2, S2 last2,
                     O result, Comp comp={},

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

               std::weakly_incrementable O,class Comp=ranges::less,
               class Proj1=std::identity,class Proj2=std::identity>
      requiresstd::mergeable<ranges::iterator_t<R1>,ranges::iterator_t<R2>,
                              O, Comp, Proj1, Proj2>
      constexpr set_union_result<ranges::borrowed_iterator_t<R1>,
                                 ranges::borrowed_iterator_t<R2>, O>
          set_union( R1&& r1, R2&& r2, O result, Comp comp={},

                     Proj1 proj1={}, Proj2 proj2={});
      (2)(since C++20)
      Helper types
      template<class I1,class I2,class O>
      using set_union_result=ranges::in_in_out_result<I1, I2, O>;
      (3)(since C++20)

      Constructs a sorted union beginning atresult consisting of the set of elements present in one or both sorted input ranges[first1last1) and[first2last2).

      If some element is foundm times in[first1last1) andn times in[first2last2), then allm elements will be copied from[first1last1) toresult, preserving order, and then exactlymax(n- m,0) elements will be copied from[first2last2) toresult, also preserving order.

      The behavior is undefined if

      • the input ranges are not sorted with respect tocomp andproj1 orproj2, respectively, or
      • the resulting range overlaps with either of the input ranges.
      1) Elements are compared using the given binary comparison functioncomp.
      2) Same as(1), but usesr1 as the first range andr2 as the second range, as if usingranges::begin(r1) asfirst1,ranges::end(r1) aslast1,ranges::begin(r2) asfirst2, andranges::end(r2) aslast2.

      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 first input sortedrange of elements
      first2, last2 - the iterator-sentinel pair defining the second input sortedrange of elements
      r1 - the first input sorted range
      r2 - the second input sorted range
      result - the beginning of the output range
      comp - comparison to apply to the projected elements
      proj1 - projection to apply to the elements in the first range
      proj2 - projection to apply to the elements in the second range

      [edit]Return value

      {last1, last2, result_last}, whereresult_last is the end of the constructed range.

      [edit]Complexity

      At most\(\scriptsize 2\cdot(N_1+N_2)-1\)2·(N1+N2)-1 comparisons and applications of each projection, where\(\scriptsize N_1\)N1 and\(\scriptsize N_2\)N2 areranges::distance(first1, last1) andranges::distance(first2, last2), respectively.

      [edit]Notes

      This algorithm performs a similar task asranges::merge does. Both consume two sorted input ranges and produce a sorted output with elements from both inputs. The difference between these two algorithms is with handling values from both input ranges which compare equivalent (see notes onLessThanComparable). If any equivalent values appearedn times in the first range andm times in the second,ranges::merge would output alln+m occurrences whereasranges::set_union would outputstd::max(n, m) ones only. Soranges::merge outputs exactly\(\scriptsize (N_1+N_2)\)(N1+N2) values andranges::set_union may produce less.

      [edit]Possible implementation

      struct set_union_fn{template<std::input_iterator I1,std::sentinel_for<I1> S1,std::input_iterator I2,std::sentinel_for<I2> S2,std::weakly_incrementable O,class Comp=ranges::less,class Proj1=std::identity,class Proj2=std::identity>    requiresstd::mergeable<I1, I2, O, Comp, Proj1, Proj2>constexpr ranges::set_union_result<I1, I2, O>        operator()(I1 first1, S1 last1, I2 first2, S2 last2,                   O result, Comp comp={},                   Proj1 proj1={}, Proj2 proj2={})const{for(;!(first1== last1 or first2== last2);++result){if(std::invoke(comp,std::invoke(proj1,*first1),std::invoke(proj2,*first2))){*result=*first1;++first1;}elseif(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1))){*result=*first2;++first2;}else{*result=*first1;++first1;++first2;}}auto res1=ranges::copy(std::move(first1), std::move(last1), std::move(result));auto res2=ranges::copy(std::move(first2), std::move(last2), std::move(res1.out));return{std::move(res1.in), std::move(res2.in), std::move(res2.out)};} template<ranges::input_range R1,ranges::input_range R2,std::weakly_incrementable O,class Comp=ranges::less,class Proj1=std::identity,class Proj2=std::identity>    requiresstd::mergeable<ranges::iterator_t<R1>,ranges::iterator_t<R2>,                            O, Comp, Proj1, Proj2>constexpr ranges::set_union_result<ranges::borrowed_iterator_t<R1>,ranges::borrowed_iterator_t<R2>, O>        operator()(R1&& r1, R2&& r2, O result, Comp comp={},                   Proj1 proj1={}, Proj2 proj2={})const{return(*this)(ranges::begin(r1),ranges::end(r1),ranges::begin(r2),ranges::end(r2),                       std::move(result), std::move(comp),                       std::move(proj1), std::move(proj2));}}; inlineconstexpr set_union_fn set_union{};

      [edit]Example

      Run this code
      #include <algorithm>#include <iostream>#include <iterator>#include <vector> void print(constauto& in1,constauto& in2,auto first,auto last){std::cout<<"{ ";for(constauto& e: in1)std::cout<< e<<' ';std::cout<<"} ∪ { ";for(constauto& e: in2)std::cout<< e<<' ';std::cout<<"} =\n{ ";while(!(first== last))std::cout<<*first++<<' ';std::cout<<"}\n\n";} int main(){std::vector<int> in1, in2, out;     in1={1,2,3,4,5};    in2={3,4,5,6,7};    out.resize(in1.size()+ in2.size());constauto ret= std::ranges::set_union(in1, in2, out.begin());    print(in1, in2, out.begin(), ret.out);     in1={1,2,3,4,5,5,5};    in2={3,4,5,6,7};    out.clear();    out.reserve(in1.size()+ in2.size());    std::ranges::set_union(in1, in2,std::back_inserter(out));    print(in1, in2, out.cbegin(), out.cend());}

      Output:

      { 1 2 3 4 5 } ∪ { 3 4 5 6 7 } ={ 1 2 3 4 5 6 7 } { 1 2 3 4 5 5 5 } ∪ { 3 4 5 6 7 } ={ 1 2 3 4 5 5 5 6 7 }

      [edit]See also

      computes the difference between two sets
      (algorithm function object)[edit]
      computes the intersection of two sets
      (algorithm function object)[edit]
      computes the symmetric difference between two sets
      (algorithm function object)[edit]
      merges two sorted ranges
      (algorithm function object)[edit]
      returnstrue if one sequence is a subsequence of another
      (algorithm function object)[edit]
      computes the union of two sets
      (function template)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/ranges/set_union&oldid=180580"

      [8]ページ先頭

      ©2009-2025 Movatter.jp