더북(TheBook)

3.6.5 알고리즘을 포인터 범위에 적용하기

알고리즘은 범위로 지정된 데이터를 처리한다. 포인터를 저장한 컨테이너에 범위를 지정하면 범위에 대한 반복자는 포인터를 가리킨다. 따라서 알고리즘에서 포인터를 이용할 수 있도록 함수 객체를 정의해줘야 한다. 지금까지 몇 가지 알고리즘만 살펴봤지만, 몇 가지 예제로 살펴보겠다.

numeric 헤더에 정의된 accumulate() 알고리즘은 operator+() 연산자를 사용해 범위에 있는 원소들의 합계를 구한다. accumulate() 알고리즘의 두 번째 버전은 네 가지 매개변수를 지정해야 한다. 처음 두 매개변수는 범위를 지정하는 시작 반복자와 끝 반복자이고, 나머지 두 매개변수는 연산을 시작할 초깃값, 각 반복에서 원소와 누적 사이에 적용할 이항 연산을 정의한 함수 객체다. 기본 연산 대신에 이 버전을 사용할 수 있으며 범위에 포인터가 포함되어 있다면 반드시 이 버전을 사용해야만 원하는 결과를 얻을 수 있다. 다음 코드는 accumulate()를 사용해 벡터에서 shared_ptr<string>이 가리키는 string 객체들을 이어 붙인다.

using word_ptr = std::shared_ptr<std::string>;
std::vector<word_ptr> words {std::make_shared<string>(“one”), std::make_shared<string>(“two”),
                            std::make_shared<string>(“three”), std::make_shared<string>(“four”)};
auto str = std::accumulate(std::begin(words), std::end(words), string {””},
                            [](const string& s, const word_ptr& pw)->string { return s + *pw + ” “; });
 

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