set<string*> 같은 컨테이너를 사용할때 비교자를 설장해 주지 않는다면 set은 포인터의 크기를 사용한 비교를 하게 된다. 즉 포인터를 넣을때 포인터값으로 정렬되는 것을 원치 않는다면 그 포인터형을 받아서 적절히 비교 연산을 할수있는 비교 함수자가 필요한 것이다.
STL의 템플릿 매개변수는 타입이어야 하므로
코드의 위 같이 함수자를 만들어준다. (binary_function 같은 기본 클래스는 EffectiveSTL40을 참조)
아랫 부분은 set을 선언하는 간단한 예시이다. 이후는 그냥 포인터를 넣어주면 된다.
struct StringPtrLess :
public binary_function<const string*,
const string*,
bool>
{
bool operator()(const string* ps1, const string* ps2 ) const
{
return *ps1 < *ps2;
}
};typedef set<string*, StringPtrLess> StringPtrLess;
StringPtrSet ssp;
….
아랫 부분은 set을 선언하는 간단한 예시이다. 이후는 그냥 포인터를 넣어주면 된다.
포인터의 연관 컨테이너를 만드는 일과 컨테이너의 비교 타입(비교함수가 아님)을 지정하는 일은 실과 바늘의 관계라고 생각해 두는것이 좋다. 일반적으로 포인터를 역참조 하여 그 포인터가 가르키는 객체의 값으로 비교를 하게 될 것이니 코드 작성시 이런 경우가 잦을 때에는 비교함수자의 템플릿을 준비해 두는것이 좋을 것이다.
string DerefenceLess{
template<typename PtrType>
bool operator()(PtrType pT1, PtrType pT2) const
{
return *pT1 < *pT2;
}
};…
set<string*, DerefenceLess> ssp; // set<string*, StringPtrLess> 와 똑같이 동작