set stl을 보면 set<customeType, customclass>로 되어 있다.
흔히 쓸때 set<int> 이런식으로 사용하며, 디폴트로 된 값이 설정되어 굳이 설정할 필요 없다.
하지만, 중복 체크 하는 조건이 사용자 입맛에 맞게 변경해야 한다면 설정해야 하는 부분.
의외로 잘 까먹는 부분이니 정리해 뒀다.
EX 1)
// !< 데이터 담을 구조체
struct SDataInfo
{
int nIndex;
int nRelateIndex;
int nParam;
SDataInfo()
{
Initialize();
}
void Initialize()
{
memset( this, 0x00, sizeof(SDataInfo) );
}
SDataInfo& operator=( const SDataInfo& rhsDataInfo )
{
memcpy( this, &rhsDataInfo, sizeof(SDataInfo) );
return (*this);
}
};
// !< SDataInfo에 사용할 Custom Operator 설정한 구조체
// !< set은 모든 자료를 비교하여 데이터가 틀리면 중복이 아니라고 판단하여 저장
// !< 만약, 사용자가 원하는 변수만 중복 체크를 원한다면 operator 재정의 필요
// !< 중복 체크 및 정렬 기능도 같이 넣어야 하기에 잘 생각하고 만들어야 하니 주의
// !< 만약 제대로 정의 되지 않는다면 데이터가 들어가지 않거나 실행 오류 발생
struct SDataInfoCustomOperator
{
bool operator()( const SDataInfo& lhs, const SDataInfo& rhs ) const
{
// !< nIndex 가 같은 것만 insert
if( lhs.nIndex != rhs.nIndex ) return false;
// !< nRelateIndex만 중복 체크 && 정렬
if( lhs.nRelateIndex == rhs.nRelateIndex ) return false;
if( lhs.nRelateIndex > rhs.nRelateIndex ) return false;
return true;
}
};
// !< 선언
// !< custom operator 구조체도 추가해 준다.
std::set<SDataInfo, SDataInfoCustomOperator> setDataInfo;
#####################################################
EX 2)
// !< 데이터 담을 구조체
struct SDataInfo
{
int32_t nIndex;
bool bCondition;
int64_t llExpireTime;
int32_t nRelateIndex;
int32_t nParam;
SDataInfo() { Initialize(); }
void Initialize()
{
memset( this, 0x00, sizeof(SDataInfo) );
}
SDataInfo& operator=( const SDataInfo& rhsDataInfo )
{
memcpy( this, &rhsDataInfo, sizeof(SDataInfo) );
return (*this);
}
};
// !< SDataInfo에 사용할 Custom Operator 설정한 구조체
struct SDataInfoCustomOperator
{
bool operator()( const SDataInfo& lhs, const SDataInfo& rhs ) const
{
// !< nIndex 가 같은 것만 insert (nIndex 중복 체크)
if( lhs.nIndex != rhs.nIndex )
return false;
// !< nRelateIndex만 중복 체크 && 정렬
if (lhs. llExpireTime == rhs.llExpireTime )
{
// !< llExpireTime 이 같다면 Index 순서로 정렬
if (lhs.nIndex > rhs.nIndex)
return false;
}
else
{
if (false == lhs.isInfinitePeriod && false == rhs.isInfinitePeriod)
{
// !< bCondition 이 거짓 인것은 날짜 순으로 앞으로 정렬
if (lhs.tExpireTime > rhs.tExpireTime)
return false;
}
else
{
// !< bCondition 이 참 인것은 제일 뒤로 정렬
if (true == lhs. bCondition)
return false;
}
}
return true;
}
};
// !< 선언
std::set<SDataInfo, SDataInfoCustomOperator> setDataInfo;
'[ Programing ] > STL & Booster' 카테고리의 다른 글
std::string <-> std::wstring (0) | 2013.11.14 |
---|---|
stringstream.... INI 파일 읽어 구분 문자 별로 값 넣기. (0) | 2013.06.26 |
날짜 기간 계산 의사 랜덤 코드 uniform_int_distribution (0) | 2013.05.22 |
stl 처리 속도 테스트 (0) | 2013.05.22 |
Boost 설치 설명 (0) | 2013.05.21 |