티스토리 뷰




이번편은 컨테이너의 포인터 타입에 대해 비교타입을 특정하라입니다.



set이나 map과 같은 associative container들은 항상 정렬상태를 유지하는 특징을 갖고 있습니다.


이때 정렬상태는 기준이 되는 특정 함수를 통해 비교를 통해 상태를 유지합니다.


set의 생성자함수 정의를 보면 알 수 있지만


비교를 위한 함수를 생성자를 선택하지 않으면 내부적으로 less<T>를 함수포인터로 갖게 됩니다.


less의 구현


less는 별다른 동작 없이 < 연산만을 하여 그 결과를 반환합니다.


하지만 T가 pointer type인경우는 어떻게 될까요?



결론은 포인터 주소를 비교하게 되게 때문에 원하는 대로 정렬이 되지 않습니다.


less<T*>를 한다해도 역시 *T 로 비교하지 않는 이상 의미가 없구요


따라서 사용자 정의 함수를 비교함수로 하게끔 해야합니다.





//https://github.com/PuppyRush/effective-stl-eaxmple/blob/master/example/example/item20.cpp
#include "includeIndicator.hpp"
bool comp_ptr(const int* lhs, const int *rhs)
{
return lhs < rhs;
}
void item20()
{
set<int> ary;
ary.insert(3);
ary.insert(4);
printer::printRange<int>(ary.begin(), ary.end());
printer::printRange<int>(ary.begin(), ary.end()); printer::print("ptr타입이 아니면 정상출력");
printer::enter(2);
set<int*> ptrary;
ptrary.insert(new int(30));
ptrary.insert(new int(5));
ptrary.insert(new int(10));
ptrary.insert(new int(141));
ptrary.insert(new int(15));
printer::printRange<int*>(ptrary.begin(), ptrary.end());
printer::print("set의 의도와 달리 순서가 이상하게 출력되고 있음.");
printer::enter(2);
set<int*, less<int*>> s;
s.insert(new int(10));
s.insert(new int(9));
s.insert(new int(8));
s.insert(new int(7));
s.insert(new int(8));
s.insert(new int(1));
s.insert(new int(51));
printer::printRange<int*>(s.begin(), s.end());
printer::print("less<int*>으로도 포인터(주소)를 비교하고 있으므로 주소로 정렬이 됨.");
printer::enter(2);
printer::print("comp_ptr함수 호출");
cout << "\n" << comp_ptr(new int(3), new int(1)) << "\n";
const auto ptrcomp = [&](const int *lhs, const int *rhs){
return *lhs < *rhs;
};
printer::enter(2);
set<int*, decltype(ptrcomp)> ptr_compset(ptrcomp);
ptr_compset.insert(new int(34));
ptr_compset.insert(new int(32));
ptr_compset.insert(new int(1));
ptr_compset.insert(new int(151));
ptr_compset.insert(new int(-5));
printer::printRange<int*>(ptr_compset.begin(), ptr_compset.end());
printer::print("pointer type을 위한 비교함수를 특별히 정의하여 set생성자에서 이용");
printer::enter(2);
}
view raw item20.cpp hosted with ❤ by GitHub


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함