블로그는 나의 힘!

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;








 

Posted by Mister_Q