Namespaces
Variants

std::experimental::ranges:: for_each

From cppreference.net
헤더 파일에 정의됨 <experimental/ranges/algorithm>
template < InputIterator I, Sentinel < I > S, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < I, Proj >> Fun >
ranges:: tagged_pair < tag:: in ( I ) , tag:: fun ( Fun ) >

for_each ( I first, S last, Fun f, Proj proj = Proj { } ) ;
(1) (ranges TS)
template < InputRange R, class Proj = ranges:: identity ,

IndirectUnaryInvocable < projected < ranges:: iterator_t < R > , Proj >> Fun >
ranges:: tagged_pair < tag:: in ( ranges:: safe_iterator_t < R > ) , tag:: fun ( Fun ) >

for_each ( R && r, Fun f, Proj proj = Proj { } ) ;
(2) (ranges TS)
1) 주어진 범위 [ first , last ) 내의 모든 반복자를 역참조한 결과에 프로젝션 proj 를 적용한 후, 그 결과에 주어진 함수 객체 f 를 순서대로 호출합니다 (즉, ranges:: invoke ( f, ranges:: invoke ( proj, * i ) ) ).
2) (1) 과 동일하지만, r 을 소스 범위로 사용하며, 마치 ranges:: begin ( r ) first 로, ranges:: end ( r ) last 로 사용하는 것과 같습니다.

두 오버로드 모두에서, 반복자 타입이 mutable인 경우, f 는 역참조된 반복자를 통해 범위의 요소들을 수정할 수 있습니다. 만약 f 가 결과를 반환하는 경우, 해당 결과는 무시됩니다.

다른 알고리즘들과 달리, for_each는 요소들이 사소하게 복사 가능하더라도 시퀀스 내 요소들의 복사본을 만들 수 없습니다.

std::for_each (이 MoveConstructible 만 요구하는 것)와 달리, 이 함수들은 Fun CopyConstructible 을 모델링해야 합니다.

위에 기술된 선언들과는 별개로, 알고리즘 선언의 실제 템플릿 매개변수 개수와 순서는 명시되지 않습니다. 따라서 알고리즘을 호출할 때 명시적 템플릿 인자를 사용하는 경우, 해당 프로그램은 이식성이 없을 가능성이 높습니다.

목차

매개변수

first, last - 함수를 적용할 범위
r - 함수를 적용할 범위
f - 범위 내 각 투영된 요소에 적용할 호출 가능 객체
proj - 요소에 적용할 투영

반환값

다음 두 멤버를 포함하는 tagged_pair 객체:

  • 첫 번째 멤버는 태그 tag::in 를 가지며, 소스 범위의 past-the-end iterator입니다 (즉, 센티넬 last 와 비교 시 동일한 것으로 판별되는 I 타입의 iterator).
  • 두 번째 멤버는 태그 tag::fun 를 가지며, std::move(f) 로부터 초기화됩니다 (함수 객체의 모든 적용이 완료된 후).

복잡도

정확히 last - first 번의 f proj 적용.

가능한 구현

template<InputIterator I, Sentinel<I> S, class Proj = ranges::identity,
         IndirectUnaryInvocable<ranges::projected<I, Proj>> Fun>
auto for_each(I first, S last, Fun f, Proj proj = Proj{}) 
    -> ranges::tagged_pair<tag::in(I), tag::fun(Fun)>
{
    for (; first != last; ++first)
        ranges::invoke(f, ranges::invoke(proj, *first));
    return {std::move(first), std::move(f)};
}

예제

참고 항목

요소 범위에 함수를 적용합니다
(함수 템플릿)
range- for loop (C++11) 범위에 대한 루프를 실행합니다
함수 객체 범위 의 요소에 적용합니다
(함수 템플릿)
(C++17)
함수 객체를 시퀀스의 처음 N개 요소에 적용합니다
(함수 템플릿)