none
[Tip] CAtlMap에서 KEY 값을 두 개 사용하고 싶을 때 RRS feed

  • 일반 토론

  • CAtlMap을 사용할 보통 KEY는 하나의 값을 사용합니다. 그런데 KEY 값이 하나가 아닌 두 개가 되어야 하나의 KEY가 되는 경우가 있습니다.

    이럴 때는 KEY가 되는 것을 struct로 정의하고, CElementTraits을 상속 받는 Traits 클래스를 만들어야 합니다.

     

     

    #include <atlcoll.h>
    #include <boost/functional/hash.hpp>  // hash
    를 만들기 위해 사용

    // KEY가 될 유저 정의형
    struct FRIENDKEY
    {
        union
        {
            struct KEY
            {
                INT32    MyID;
                INT32  FriendID;
            };
            KEY Key;
            INT64 nValue;
        };

        FRIENDKEY() : nValue(0) {}
        FRIENDKEY(INT64 _value) : nValue(_value) {}
        FRIENDKEY(INT32 _MyID, INT32 _FriendID)
        {
            Key.MyID = _MyID;
            Key.FriendID = _FriendID;
        }
    };

    class FriendKeyTraits : public CElementTraits <FRIENDKEY>
    {
    public:
        static ULONG Hash(const FRIENDKEY& element) throw()
        {
            boost::hash<INT64> hasher;
            return (ULONG)hasher(element.nValue);
        }

        static bool CompareElements(const FRIENDKEY& a, const FRIENDKEY& b)
        {
            return (a.Key.nMyID == b.Key.MyID && a.Key.FriendID == b.Key.FriendID) ? true : false;
        };
    };

    struct FRIENDPRESENT
    {
        INT32    a;
        INT32 b;
        char c;
        INT16 d;
    };

     

    typedef CAtlMap<FRIENDKEY, FRIENDPRESENT, FriendKeyTraits > MAP_FRIEND;
    MAP_FRIEND m_Frinedlist;

     

    bool IsExitFriendPresent( INT32 MyID, INT32 FriendID )
    {
        FRIENDKEY FriendKey( MyID, FriendID );
        bool bIsExit = m_Frinedlist.Lookup( FriendKey );
        return bIsExit;
    }

     

    이거 말고 더 좋은 방법이나, KEY로 사용할 값이 3 개 이상인 경우는 어떻게 하면 좋을지 덧글 부탁합니다.^^


    Twitter : jacking75 블로그 : http://jacking.tistory.com/
    2009년 11월 1일 일요일 오후 5:54

모든 응답

  • 64비트 Int 와   boost::hash<INT64> hasher 를 이용하신 아이디어가 참 좋네요
    32비트 DWORD를 두개 WORD로 쪼개어서 사용할 수도 있겠네요^^

    좋은 정보 감사합니다.
    2009년 11월 3일 화요일 오전 8:21