안녕하세요. 방수철입니다.
다들 즐거운 한가위를 보내셨는지 궁금하세요.
저는 여러모로 바쁜일이 추석 직전까지 있어서 정신 없이 시간을 보내고 푹 쉬다가
다시 글을 쓰게 됬습니다. 이전 글과 비교해서 너무 오래동안 글이 없었네요.
혹여 기다리신 분들이 있다면 죄송합니다.

이번 글에서는 all_of, any_of, none_of 에 대해서 설명하겠습니다.
이 세가지 함수는 VS2010에서 새로이 <algorithm> 에 추가되었습니다.
이 함수들은 반복자로 탐색이 가능한 구조체에서 특정 조건을 만족하는 원소가 있는지 확인하는 기능을 합니다.

template <class InputIterator, class Predicate>
  bool none_of(InputIterator first, InputIterator last, Predicate pred);

template <class InputIterator, class Predicate>
  bool any_of(InputIterator first, InputIterator last, Predicate pred);

template <class InputIterator, class Predicate>
  bool all_of(InputIterator first, InputIterator last, Predicate pred);

위와 같이 정의된 함수들은 똑같이 세가지 인수를 입력으로 받습니다.

first : 조건을 만족하는지 시험할 범위의 시작 위치의 반복자
last : 조건을 만족하는지 시험할 범위의 마지막 위치의 반복자
pred : 조건을 만족하는지 시험할 때에 사용되는 function 객체. 반드시 한개의 인수만을 전달받아야 하며 true또는 false를 반환해야 한다.

이렇게 인수가 주어질때에 각각의 함수는 다음과 같이 반환하게 됩니다.

all_of : 주어진 범위에서 모든 원소들이 조건을 만족하면 true, 그렇지 않으면 false를 반환한다.
any_of :
주어진 범위에서 한개 이상의 원소들이 조건을 만족하면 true, 그렇지 않으면 false를 반환한다.
none_of :
주어진 범위에서 모든 소들이 조건을 만족하지 않으면 true, 그렇지 않으면 false를 반환한다.

다음의 코드는 numbers라는 배열의 값을 여러 조건식으로 all_of, any_of, none_of를 실행시켜본 것이다.

    array<int,5> numbers = {2, 3, 4, 6, 7};

    auto isPositive = [](int n) { return n > 0; };
    auto isNegative = [](int n) { return n < 0; };
    auto isZero     = [](int n) { return n == 0; };
    auto isEven     = [](int n) { return n % 2 == 0; };
    auto isOdd      = [](int n) { return n % 2 != 0; };

    array<function<bool(int)>, 5> func = {isPositive, isNegative, isZero, isEven, isOdd};
    array<std::string, 5> desc = {"isPositive",
                                  "isNegative", 
                                  "isZero    ", 
                                  "isEven    ", 
                                  "isOdd     " };

    cout<<"The list is { ";
    for_each(numbers.begin(), numbers.end(), [](int n){ cout<<n<<", ";});
    cout<<"}"<<endl;

    cout << "\t\tall_of\tany_of\tnone_of"<<endl;

    for(int i = 0 ; i<5 ; ++i )
    {
        cout << desc[i].c_str() << "\t";
        cout << all_of(numbers.begin(), numbers.end(), func[i]) << "\t";
        cout << any_of(numbers.begin(), numbers.end(), func[i]) << "\t";
        cout << none_of(numbers.begin(), numbers.end(), func[i]) << "\t";
        cout << endl;
    }


아래는 실행 결과입니다.


위의 코드에서 조건식을 변환해본다거나, 주어지는 숫자의 배열에 변화를 줘가면서 테스트를 해보면 더 쉽게 이해 될 것 입니다.