Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::partition_copy

      From cppreference.com
      <cpp‎ |algorithm
       
       
      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
      partition_copy
      (C++11)  
      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
       
      Defined in header<algorithm>
      template<class InputIt,class OutputIt1,

               class OutputIt2,class UnaryPred>
      std::pair<OutputIt1, OutputIt2>
          partition_copy( InputIt first, InputIt last,
                          OutputIt1 d_first_true, OutputIt2 d_first_false,

                          UnaryPred p);
      (1)(since C++11)
      (constexpr since C++20)
      template<class ExecutionPolicy,class ForwardIt1,class ForwardIt2,

               class ForwardIt3,class UnaryPred>
      std::pair<ForwardIt2, ForwardIt3>
          partition_copy( ExecutionPolicy&& policy,
                          ForwardIt1 first, ForwardIt1 last,
                          ForwardIt2 d_first_true, ForwardIt3 d_first_false,

                          UnaryPred p);
      (2)(since C++17)
      1) Copies the elements from the range[firstlast) to two different ranges depending on the value returned by the predicatep.
      • The elements that satisfy the predicatep are copied to the range beginning atd_first_true.
      • The rest of the elements are copied to the range beginning atd_first_false.
      2) Same as(1), but executed according topolicy.
      This overload participates in overload resolution only if all following conditions are satisfied:

      std::is_execution_policy_v<std::decay_t<ExecutionPolicy>> istrue.

      (until C++20)

      std::is_execution_policy_v<std::remove_cvref_t<ExecutionPolicy>> istrue.

      (since C++20)

      If*first is notwritable tod_first_true ord_first_false, the program is ill-formed.

      Among the input range and the two output ranges, if any two ranges overlap, the behavior is undefined.

      Contents

      [edit]Parameters

      first, last - the pair of iterators defining the sourcerange of elements to copy from
      d_first_true - the beginning of the output range for the elements that satisfyp
      d_first_false - the beginning of the output range for the elements that do not satisfyp
      policy - theexecution policy to use
      p - unary predicate which returns ​true if the element should be placed in d_first_true.

      The expressionp(v) must be convertible tobool for every argumentv of type (possibly const)VT, whereVT is the value type ofInputIt, regardless ofvalue category, and must not modifyv. Thus, a parameter type ofVT&is not allowed, nor isVT unless forVT a move is equivalent to a copy(since C++11).​

      Type requirements
      -
      InputIt must meet the requirements ofLegacyInputIterator.
      -
      OutputIt1, OutputIt2 must meet the requirements ofLegacyOutputIterator.
      -
      ForwardIt1, ForwardIt2, ForwardIt3 must meet the requirements ofLegacyForwardIterator.
      -
      UnaryPred must meet the requirements ofPredicate.

      [edit]Return value

      Astd::pair constructed from the iterator to the end of thed_first_true range and the iterator to the end of thed_first_false range.

      [edit]Complexity

      Exactlystd::distance(first, last) applications ofp.

      For the overload(2), there may be a performance cost ifForwardIt's value type is notCopyConstructible.

      [edit]Exceptions

      The overload with a template parameter namedExecutionPolicy reports errors as follows:

      • If execution of a function invoked as part of the algorithm throws an exception andExecutionPolicy is one of thestandard policies,std::terminate is called. For any otherExecutionPolicy, the behavior is implementation-defined.
      • If the algorithm fails to allocate memory,std::bad_alloc is thrown.

      [edit]Possible implementation

      partition_copy (1)
      template<class InputIt,class OutputIt1,class OutputIt2,class UnaryPred>constexpr//< since C++20std::pair<OutputIt1, OutputIt2>    partition_copy(InputIt first, InputIt last,                   OutputIt1 d_first_true, OutputIt2 d_first_false,                   UnaryPred p){for(; first!= last;++first){if(p(*first)){*d_first_true=*first;++d_first_true;}else{*d_first_false=*first;++d_first_false;}} returnstd::pair<OutputIt1, OutputIt2>(d_first_true, d_first_false);}

      [edit]Example

      Run this code
      #include <algorithm>#include <iostream>#include <utility> void print(auto rem,constauto& v){for(std::cout<< rem;constauto& x: v)std::cout<< x<<' ';std::cout<<'\n';} int main(){int arr[10]={0,1,2,3,4,5,6,7,8,9};int true_arr[5]={0};int false_arr[5]={0};     std::partition_copy(std::begin(arr),std::end(arr),std::begin(true_arr),std::begin(false_arr),[](int i){return4< i;});     print("true_arr:  ", true_arr);    print("false_arr: ", false_arr);}

      Output:

      true_arr:  5 6 7 8 9false_arr: 0 1 2 3 4

      [edit]Defect reports

      The following behavior-changing defect reports were applied retroactively to previously published C++ standards.

      DRApplied toBehavior as publishedCorrect behavior
      P0896R4C++11
      C++17
      1. the value type ofInputIt (C++11)/ForwardIt1 (C++17)
          was required to beCopyAssignable
      2. the two output ranges could overlap
      1. not required
      2. the behavior is
          undefined in this case

      [edit]See also

      divides a range of elements into two groups
      (function template)[edit]
      divides elements into two groups while preserving their relative order
      (function template)[edit]
      copies a range of elements to a new location
      (function template)[edit]
      copies a range of elements omitting those that satisfy specific criteria
      (function template)[edit]
      copies a range dividing the elements into two groups
      (algorithm function object)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/partition_copy&oldid=180531"

      [8]ページ先頭

      ©2009-2025 Movatter.jp