알파벳 순서대로 출력되길 기대하겠지만 포인터를 담고 있기 때문에 string의 16진수 포인터 값이 출력되므로 루프를 직접 만들지 말라는 좋은 예제

물론 **iterator를 사용하면 알파벳이 출력되지만 포인터 값으로 정렬되기 때문에 정렬을 기대하면 안됨

set<string*> ssp;
ssp.insert(new string("Anteater"));
ssp.insert(new string("Wombat"));

for(set<string*>::const_iterator iterator = ssp.begin(); iterator != ssp.end(); ++iterator)
{
    cout << *iterator << endl;
}

 

ostream_iterator에 스트림으로 출력해 보낼 객체의 타입을 string으로 정했는데 ssp에 들어있는 것은 string*이므로 컴파일 에러 발생

copy(ssp.begin(), ssp.end(), ostream_iterator<string>(cout, "\n"));

 

string*를 매개변수로 받아 string끼리 비교 함수자 구현하여 정렬 지원

struct DereferencePtrLess
{
    template<typename PtrType>
    bool operator()(PtrType pT1, PtrType pT2)
    {
        return *pT1 < *pT2;
    }
};

using StringPtrSet = set<string*, DereferencePtrLess>
StringPtrSet ssp;

 

루프를 직접 만들지 않고 알고리즘을 통한 순회

for_each(ssp.begin(), ssp.end(), [](const string* ps){ cout << *ps << std::endl;});

transform(ssp.begin(), ssp.end(), ostream_iterator<string>(cout, "\n"), Dereference());

 

set 템플릿에 들어가는 매개 변수는 타입이어야 하므로 비교 함수를 넣을 경우 컴파일되지 않음

bool stringPtrLess(const string* ps1, const string* ps2)
{
    return *ps1 < *ps2;
}

set<string, stringPtrLess> ssp; // 컴파일 에러

 

포인터 뿐만 아니라 포인터처럼 동작하는 객체(스마트 포인터, 반복자 등)에도 적용되는 내용

+ Recent posts

목차