모두의 코드
C++ 레퍼런스 - for_each 함수

작성일 : 2019-01-19 이 글은 1353 번 읽혔습니다.

아직 C++ 에 친숙하지 않다면 씹어먹는 C++ 은 어때요?

for_each

<algorithm> 에 정의됨

template <class InputIterator, class Function>
Function for_each(InputIterator first, InputIterator last, Function fn);

범위 내에 원소들에 대해 함수를 실행시킵니다.

범위 내 (first 부터 last 전 까지) 원소들 각각에 대해 함수 fn 을 실행한다. 참고로 함수의 리턴값은 무시됩니다.

인자들

참고로 fn 은 아래와 같이 정의될 수 있습니다.

void fun(const Type &a);

이 때, 인자의 경우 꼭 const& 일 필요는 없습니다. 또한, 반복자를 역참조한 타입이 Type 과 일치(혹은 Type 으로 변환 될 수 있어야 함) 해야 합니다.

리턴값

전달된 함수 객체(fn)를 리턴합니다.

std::transform 과의 관계

참고로 transform 함수도 for_each 함수와 하는 일은 거의 동일합니다. transform 함수 역시, 범위 내에 원소들에 대해 전달된 함수를 호출하게 됩니다. 다만, 두 함수가 하는 역할은 조금 다른데

구현 예시

template <class InputIt, class UnaryFunction>
constexpr UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f) {
  for (; first != last; ++first) {
    f(*first);
  }
  return f;
}

실행 예제

#include <algorithm>  // std::for_each
#include <iostream>   // std::cout
#include <vector>     // std::vector

void myfunction(int i) {  // function:
  std::cout << ' ' << i;
}

struct myclass {  // function object type:
  void operator()(int i) { std::cout << ' ' << i; }
} myobject;

int main() {
  std::vector<int> myvector;
  myvector.push_back(10);
  myvector.push_back(20);
  myvector.push_back(30);

  // 일반적인 함수 포인터 전달
  std::cout << "myvector contains:";
  for_each(myvector.begin(), myvector.end(), myfunction);
  std::cout << '\n';

  // Functor 를 전달
  std::cout << "myvector contains:";
  for_each(myvector.begin(), myvector.end(), myobject);
  std::cout << '\n';

  // 람다 함수를 전달
  std::cout << "myvector contains:";
  for_each(myvector.begin(), myvector.end(),
           [](const int& n) { std::cout << ' ' << n; });
  std::cout << '\n';

  return 0;
}

실행 결과

실행 결과

myvector contains: 10 20 30
myvector contains: 10 20 30
myvector contains: 10 20 30

참고 자료

댓글이 1 개 있습니다!
프로필 사진 없음
강좌에 관련 없이 궁금한 내용은 여기를 사용해주세요