💡 퀵 접속: cpp.kr/for_each_n

for_each_n

C++ 표준 라이브러리의 알고리즘으로, 주어진 범위의 처음 n개 요소에 대해 지정된 함수를 실행합니다. 함수는 단항 함수로 제공되며, 각 요소를 인자로 받아 처리합니다.

기본 사용법

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    
    // 처음 5개 요소만 출력
    std::for_each_n(numbers.begin(), 5,
        [](int n) { std::cout << n << " "; });
    std::cout << std::endl;
    
    // 처음 3개 요소만 제곱하여 출력
    std::for_each_n(numbers.begin(), 3,
        [](int n) { std::cout << n * n << " "; });
    std::cout << std::endl;
    
    return 0;
}

실행 결과:

1 2 3 4 5
1 4 9

문자열에서 사용

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

int main() {
    std::string text = "Hello, World!";
    
    // 처음 5개 문자만 대문자로 변환
    std::for_each_n(text.begin(), 5,
        [](char& c) { c = std::toupper(c); });
    std::cout << "처음 5개 문자 대문자 변환: " << text << std::endl;
    
    // 처음 3개 문자만 소문자로 변환
    std::for_each_n(text.begin(), 3,
        [](char& c) { c = std::tolower(c); });
    std::cout << "처음 3개 문자 소문자 변환: " << text << std::endl;
    
    return 0;
}

실행 결과:

처음 5개 문자 대문자 변환: HELLO, World!
처음 3개 문자 소문자 변환: helLO, World!

사용자 정의 타입에서 사용

#include <iostream>
#include <vector>
#include <algorithm>
#include <string>

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector<Person> people = {
        {"Alice", 20},
        {"Bob", 25},
        {"Charlie", 30},
        {"David", 35},
        {"Eve", 40}
    };
    
    // 처음 3명의 정보만 출력
    std::for_each_n(people.begin(), 3,
        [](const Person& p) {
            std::cout << p.name << " (" << p.age << "세)" << std::endl;
        });
    
    // 처음 2명의 나이만 1씩 증가
    std::for_each_n(people.begin(), 2,
        [](Person& p) { p.age++; });
    
    std::cout << "\n처음 2명의 나이 증가 후:" << std::endl;
    std::for_each_n(people.begin(), 3,
        [](const Person& p) {
            std::cout << p.name << " (" << p.age << "세)" << std::endl;
        });
    
    return 0;
}

실행 결과:

Alice (20세)
Bob (25세)
Charlie (30세)

처음 2명의 나이 증가 후:
Alice (21세)
Bob (26세)
Charlie (30세)

참고사항

  • for_each_n은 algorithm 헤더에 정의되어 있습니다.
  • 단항 함수를 사용하여 각 요소를 처리합니다.
  • 시간 복잡도는 O(n)입니다 (n은 처리할 요소의 개수).
  • n이 0이면 아무 작업도 수행하지 않습니다.
  • n이 범위의 크기보다 크면 범위의 끝까지만 처리합니다.
  • 처음 n개 요소에 대해 동일한 작업을 수행하는 데 유용합니다.
  • 람다 함수를 사용하여 간단하게 작업을 정의할 수 있습니다.
  • 함수는 요소를 수정할 수 있습니다 (참조로 전달된 경우).
  • 반환 값은 마지막으로 처리된 요소의 다음 위치를 가리키는 반복자입니다.
함수 설명
for_each_n(first, n, f) 주어진 범위의 처음 n개 요소에 대해 함수 f를 실행