Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::ranges::set_symmetric_difference,std::ranges::set_symmetric_difference_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)
              
      set_symmetric_difference

      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_symmetric_difference_result<I1, I2, O>
          set_symmetric_difference( 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_symmetric_difference_result<ranges::borrowed_iterator_t<R1>,
                                               ranges::borrowed_iterator_t<R2>, O>
          set_symmetric_difference( 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_symmetric_difference_result=ranges::in_in_out_result<I1, I2, O>;
      (3)(since C++20)

      Computes symmetric difference of two sorted ranges: the elements that are found in either of the ranges, but not in both of them are copied to the range beginning atresult. The resulting range is also sorted.

      If some element is foundm times in[first1last1) andn times in[first2last2), it will be copied toresult exactly│m - n│ times. Ifm > n, then the lastm - n of those elements are copied from[first1last1), otherwise the lastn - m elements are copied from[first2last2). The resulting range cannot overlap with either of the input ranges.

      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 sorted input range
      r2 - the second sorted input 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]Possible implementation

      struct set_symmetric_difference_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_symmetric_difference_result<I1, I2, O>        operator()(I1 first1, S1 last1, I2 first2, S2 last2, O result, Comp comp={},                   Proj1 proj1={}, Proj2 proj2={})const{while(!(first1== last1 or first2== last2)){if(std::invoke(comp,std::invoke(proj1,*first1),std::invoke(proj2,*first2))){*result=*first1;++first1;++result;}elseif(std::invoke(comp,std::invoke(proj2,*first2),std::invoke(proj1,*first1))){*result=*first2;++first2;++result;}else{++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_symmetric_difference_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_symmetric_difference_fn set_symmetric_difference{};

      [edit]Example

      Run this code
      #include <algorithm>#include <iostream>#include <iterator>#include <vector> void visualize_this(constauto& v,int min=1,int max=9){for(auto i{min}; i<= max;++i){        std::ranges::binary_search(v, i)?std::cout<< i:std::cout<<'.';std::cout<<' ';}std::cout<<'\n';} int main(){constauto in1={1,3,4,6,7,9};constauto in2={1,4,5,6,9}; std::vector<int> out{};     std::ranges::set_symmetric_difference(in1, in2,std::back_inserter(out));     visualize_this(in1);    visualize_this(in2);    visualize_this(out);}

      Output:

      1 . 3 4 . 6 7 . 91 . . 4 5 6 . . 9. . 3 . 5 . 7 . .

      [edit]See also

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

      [8]ページ先頭

      ©2009-2025 Movatter.jp