더북(TheBook)

accumulate()의 네 번째 인수는 구간에 적용할 이항 연산자로 여기서는 람다 표현식을 썼다. 이항 함수는 accumulate() 함수의 세 번째 인수를 이항 함수의 첫 번째 인수로 받는다. 범위에 있는 반복자를 역참조한 결과를 이항 함수의 두 번째 인수로 전달한다. 따라서 람다 표현식의 첫 번째 매개변수는 세 번째 인수의 타입으로 지정하고, 두 번째 매개변수는 범위에 있는 반복자가 가리키는 원소의 타입이어야 한다. str에 저장된 결과는 문자열 "one two three four"가 된다.

조건자를 적용할 수 있는 컨테이너의 함수 멤버도 원소가 포인터라는 것을 이용해야 한다. listforward_list 컨테이너의 remove_if() 함수도 한 예일 것이다.

std::list<word_ptr> wrds {std::make_shared<string>("one"), std::make_shared<string>("two"),
                          std::make_shared<string>("three"), std::make_shared<string>("four")};
wrds.remove_if([](const word_ptr& pw){ return (*pw)[0] == 't'; });

remove_if()에 전달된 람다 표현식은 문자열의 첫 번째 문자가 't'이면 true를 반환한다. 이렇게 하면 리스트에서 "two""three"가 제거된다. 람다 표현식의 인수는 string 객체에 대한 스마트 포인터이므로 문자열에 접근하려면 역참조를 먼저 해야 한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.