더북(TheBook)

3.6.2 우선순위 큐에 포인터 저장하기

여기서는 스마트 포인터에만 집중하겠다. 원시 포인터는 객체를 삭제하는 책임이 개발자에게 있다는 점을 제외하면 원시 포인터를 저장하는 것과 스마트 포인터를 저장하는 것은 본질적으로 같다.

priority_queue나 힙을 생성할 때 원소들의 순서를 결정하는 정렬 순서가 없어서는 안 된다. 원시 포인터나 스마트 포인터를 저장할 때는 사용할 비교 함수를 반드시 제공해야 한다. 비교 함수를 제공하지 않으면 포인터가 가리키는 객체가 아니라 포인터끼리 비교하게 되는데, 이는 대부분의 경우 원하는 동작이 아닐 것이다. 어떻게 하면 자유 공간에 생성한 string 객체에 대한 포인터를 priority_queue에 저장할 수 있는지 생각해보자. 앞으로 나올 코드에는 다음 지시자가 선언되어 있다고 가정하고 설명을 이어가겠다.

using std::string;
using std::shared_ptr;
using std::unique_ptr;

shared_ptr<string> 타입의 포인터가 가리키는 객체를 비교하는 함수 객체를 정의해야 한다. 여기서는 다음과 같이 비교 함수를 정의했다.

auto comp = [](const shared_ptr<string>& wp1, const shared_ptr<string>& wp2){ return *wp1 < *wp2; };

두 스마트 포인터가 가리키는 객체를 비교하는 람다 표현식을 comp로 정의했다. 람다 표현식에 이름을 붙인 이유는 람다 표현식을 priority_queue 템플릿의 타입 인수로 지정하기 위한 것이다. 우선순위 큐에 람다 표현식 타입을 타입 인수로 지정했다.

std::priority_queue<shared_ptr<string>, std::vector<shared_ptr<string>>, decltype(comp)> words1
{comp};
 

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