Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::copy,std::copy_if

      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
      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 OutputIt>

      OutputIt copy( InputIt first, InputIt last,

                     OutputIt d_first);
      (1)(constexpr since C++20)
      template<class ExecutionPolicy,

               class ForwardIt1,class ForwardIt2>
      ForwardIt2 copy( ExecutionPolicy&& policy,
                       ForwardIt1 first, ForwardIt1 last,

                       ForwardIt2 d_first);
      (2)(since C++17)
      template<class InputIt,class OutputIt,class UnaryPred>

      OutputIt copy_if( InputIt first, InputIt last,

                        OutputIt d_first, UnaryPred pred);
      (3)(since C++11)
      (constexpr since C++20)
      template<class ExecutionPolicy,

               class ForwardIt1,class ForwardIt2,class UnaryPred>
      ForwardIt2 copy_if( ExecutionPolicy&& policy,
                          ForwardIt1 first, ForwardIt1 last,

                          ForwardIt2 d_first, UnaryPred pred);
      (4)(since C++17)

      Copies the elements in the range, defined by[firstlast), to another range beginning atd_first (copy destination range).

      1) Copies all elements in the range[firstlast) starting fromfirst and proceeding tolast.
      Ifd_first is in[firstlast), the behavior is undefined. In this case,std::copy_backward may be used instead.
      2) Copies the elements, 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[firstlast) and the copy destination range overlaps, the behavior is undefined.
      3) Only copies the elements for which the predicatepred returnstrue. This copy algorithm is stable: the relative order of the elements that are copied is preserved.
      If[firstlast) and the copy destination range overlaps, the behavior is undefined.
      4) Same as(3), 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)

      Contents

      [edit]Parameters

      first, last - the pair of iterators defining the sourcerange of elements to copy
      d_first - the beginning of the destination range
      policy - theexecution policy to use
      pred - unary predicate which returns ​true for the required elements.

      The expressionpred(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.
      -
      OutputIt must meet the requirements ofLegacyOutputIterator.
      -
      ForwardIt1, ForwardIt2 must meet the requirements ofLegacyForwardIterator.
      -
      UnaryPred must meet the requirements ofPredicate.

      [edit]Return value

      Output iterator to the element in the destination range, one past the last element copied.

      [edit]Complexity

      Given\(\scriptsize N\)N asstd::distance(first, last):

      1,2) Exactly\(\scriptsize N\)N assignments.
      3,4) Exactly\(\scriptsize N\)N applications of the predicatepred, and at most\(\scriptsize N\)N assignments.

      For the overloads with anExecutionPolicy, there may be a performance cost ifForwardIt1's value type is notMoveConstructible.

      [edit]Exceptions

      The overloads with a template parameter namedExecutionPolicy report 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

      copy (1)
      template<class InputIt,class OutputIt>OutputIt copy(InputIt first, InputIt last,              OutputIt d_first){for(; first!= last;(void)++first,(void)++d_first)*d_first=*first; return d_first;}
      copy_if (3)
      template<class InputIt,class OutputIt,class UnaryPred>OutputIt copy_if(InputIt first, InputIt last,                 OutputIt d_first, UnaryPred pred){for(; first!= last;++first)if(pred(*first)){*d_first=*first;++d_first;} return d_first;}

      [edit]Notes

      In practice, implementations ofstd::copy avoid multiple assignments and use bulk copy functions such asstd::memmove if the value type isTriviallyCopyable and the iterator types satisfyLegacyContiguousIterator.

      When copying overlapping ranges,std::copy is appropriate when copying to the left (beginning of the destination range is outside the source range) whilestd::copy_backward is appropriate when copying to the right (end of the destination range is outside the source range).

      [edit]Example

      The following code usesstd::copy both to copy the contents of onestd::vector to another and to display the resultingstd::vector.

      Run this code
      #include <algorithm>#include <iostream>#include <iterator>#include <numeric>#include <vector> int main(){std::vector<int> from_vector(10);std::iota(from_vector.begin(), from_vector.end(),0);std::vector<int> to_vector;    std::copy(from_vector.begin(), from_vector.end(),std::back_inserter(to_vector)); // or, alternatively,//  std::vector<int> to_vector(from_vector.size());//  std::copy(from_vector.begin(), from_vector.end(), to_vector.begin());// either way is equivalent to//  std::vector<int> to_vector = from_vector; std::cout<<"to_vector contains: ";    std::copy(to_vector.begin(), to_vector.end(),std::ostream_iterator<int>(std::cout," "));std::cout<<'\n'; std::cout<<"odd numbers in to_vector are: ";    std::copy_if(to_vector.begin(), to_vector.end(),std::ostream_iterator<int>(std::cout," "),[](int x){return x%2!=0;});std::cout<<'\n'; std::cout<<"to_vector contains these multiples of 3: ";    to_vector.clear();    std::copy_if(from_vector.begin(), from_vector.end(),std::back_inserter(to_vector),[](int x){return x%3==0;}); for(constint x: to_vector)std::cout<< x<<' ';std::cout<<'\n';}

      Possible output:

      to_vector contains: 0 1 2 3 4 5 6 7 8 9odd numbers in to_vector are: 1 3 5 7 9to_vector contains these multiples of 3: 0 3 6 9

      [edit]Defect reports

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

      DRApplied toBehavior as publishedCorrect behavior
      LWG 2039C++11the return value ofstd::copy_if was not specifiedspecified
      LWG 2044C++11the stability ofstd::copy_if was not defineddefined

      [edit]See also

      copies a range of elements in backwards order
      (function template)[edit]
      creates a copy of a range that is reversed
      (function template)[edit]
      (C++11)
      copies a number of elements to a new location
      (function template)[edit]
      copy-assigns the given value to every element in a range
      (function template)[edit]
      copies a range of elements omitting those that satisfy specific criteria
      (function template)[edit]
      copies a range of elements to a new location
      (algorithm function object)[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/copy&oldid=180520"

      [8]ページ先頭

      ©2009-2025 Movatter.jp