Movatterモバイル変換


[0]ホーム

URL:


cppreference.com
Namespaces
Variants
    Actions

      std::for_each

      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 UnaryFunc>
      UnaryFunc for_each( InputIt first, InputIt last, UnaryFunc f);
      (1)(constexpr since C++20)
      template<class ExecutionPolicy,class ForwardIt,class UnaryFunc>

      void for_each( ExecutionPolicy&& policy,

                     ForwardIt first, ForwardIt last, UnaryFunc f);
      (2)(since C++17)

      Applies the given unaryfunction objectf to the result of dereferencing everyiterator in therange[firstlast). Iff returns a result, the result is ignored.

      1)f is applied in order starting fromfirst.

      IfUnaryFunc is notMoveConstructible, thebehavior is undefined.

      (since C++11)
      2)f might not be applied in order. The algorithm is 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)
      IfUnaryFunc is notCopyConstructible, thebehavior is undefined.

      If the iterator type (InputIt/ForwardIt) is mutable,f may modify the elements of therange through the dereferenced iterator.

      Unlike the rest of the parallel algorithms,for_each is not allowed to make copies of the elements in the sequence even if they areTriviallyCopyable.

      Contents

      [edit]Parameters

      first, last - the pair of iterators defining therange of elements to which thefunction object will be applied
      policy - theexecution policy to use
      f - function object, to be applied to the result of dereferencing every iterator in therange[firstlast)

      The signature of the function should be equivalent to the following:

       void fun(const Type&a);

      The signature does not need to haveconst&.
      The type Type must be such that an object of typeInputIt can be dereferenced and then implicitly converted to Type.

      Type requirements
      -
      InputIt must meet the requirements ofLegacyInputIterator.
      -
      ForwardIt must meet the requirements ofLegacyForwardIterator.

      [edit]Return value

      1)f
      2) (none)

      [edit]Complexity

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

      [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

      See also the implementations inlibstdc++,libc++ andMSVC stdlib.

      template<class InputIt,class UnaryFunc>constexpr UnaryFunc for_each(InputIt first, InputIt last, UnaryFunc f){for(; first!= last;++first)        f(*first); return f;// implicit move since C++11}

      [edit]Notes

      For overload(1),f can be a stateful function object. The return value can be considered as the final state of the batch operation.

      For overload(2), multiple copies off may be created to perform parallel invocation. No value is returned because parallelization often does not permit efficient state accumulation.

      [edit]Example

      The following example uses alambda-expression to increment all of the elements of a vector and then uses an overloadedoperator() in a function object (i.k.a., "functor") to compute their sum. Note that to compute the sum, it is recommended to use the dedicated algorithmstd::accumulate.

      Run this code
      #include <algorithm>#include <iostream>#include <vector> int main(){std::vector<int> v{3,-4,2,-8,15,267}; auto print=[](constint& n){std::cout<< n<<' ';}; std::cout<<"before:\t";    std::for_each(v.cbegin(), v.cend(), print);std::cout<<'\n'; // increment elements in-place    std::for_each(v.begin(), v.end(),[](int&n){ n++;}); std::cout<<"after:\t";    std::for_each(v.cbegin(), v.cend(), print);std::cout<<'\n'; struct Sum{void operator()(int n){ sum+= n;}int sum{0};}; // invoke Sum::operator() for each element    Sum s= std::for_each(v.cbegin(), v.cend(), Sum());std::cout<<"sum:\t"<< s.sum<<'\n';}

      Output:

      before:3 -4 2 -8 15 267 after:4 -3 3 -7 16 268 sum:281

      [edit]Defect reports

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

      DRApplied toBehavior as publishedCorrect behavior
      LWG 475C++98it was unclear whetherf can modify the elements
      of the sequence being iterated over (for_each is
      classified as “non-modifying sequence operations”)
      made clear (allowed if the
      iterator type is mutable)
      LWG 2747C++11overload(1) returnedstd::move(f)returnsf (which implicitly moves)

      [edit]See also

      applies a function to a range of elements, storing results in a destination range
      (function template)[edit]
      (C++17)
      applies a function object to the first N elements of a sequence
      (function template)[edit]
      applies a unaryfunction object to elements from arange
      (algorithm function object)[edit]
      applies a function object to the first N elements of a sequence
      (algorithm function object)[edit]
      range-for loop(C++11) executes loop over range[edit]
      Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/algorithm/for_each&oldid=180672"

      [8]ページ先頭

      ©2009-2025 Movatter.jp