알파벳 순서대로 출력되길 기대하겠지만 포인터를 담고 있기 때문에 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; // 컴파일 에러
포인터 뿐만 아니라 포인터처럼 동작하는 객체(스마트 포인터, 반복자 등)에도 적용되는 내용
'C++ > Effective STL' 카테고리의 다른 글
Effective STL 항목 22 표준 연관 컨테이너에 저장된 데이터 요소에 대해 키를 바꾸는 일은 피하자 (0) | 2025.01.06 |
---|---|
Effective STL 항목 21 연관 컨테이너용 비교 함수는 같은 값에 대해 false를 반환해야 한다 (0) | 2025.01.05 |
Effective STL 항목 19 상등 관계(equality)와 동등 관계(equivalence)의 차이를 파악하자 (0) | 2025.01.02 |
Effective STL 항목 18 vector<bool> 보기를 돌 같이 하자 (0) | 2025.01.01 |
Effective STL 항목 16 기존의 C API에 vector와 string을 넘기는 방법을 알아 두자 (0) | 2024.12.30 |