Boost.multi_index

              최흥배
     Twitter : @jacking75
 E-mail : jacking75@gmail.com

                  주체 : 온라인 서버 개발자 모임
                  후원 : 넷텐션
multi_index
 multi : 다양한
 index : 색인
class Character
{                       Key
   INT32 m_nCharID;       Key
   wstring m_strName;

     INT16 nLevel;
     INT32 nMoney;
     .....
};
std::map<INT32, Character> m_CharSetByCharID
std::map<wstring, Character> m_CharSetByName


m_CharSetByCharID.insert
m_CharSetByName.insert


m_CharSetByName.erase
m_CharSetByCharID.erase
struct Character         std::map<INT32, Character> m_CharSetByCharID
{
   INT32 nCharID;        std::map<wstring, Character> m_CharSetByName
   wstring strName;

     INT16 nLevel;       m_CharSetByCharID.insert
     INT32 nMoney;       m_CharSetByName.insert
     .....
};
                         m_CharSetByName.erase
                         m_CharSetByCharID.erase




        Key 는 2 개이지만 둘 다 하나의 객체를 가리킨다

        실수로 m_CharSetByCharID 나 m_CharSetByName 중
        한쪽만 추가를 하던가 , 또는 한쪽만 삭제를 한다면
multi_index
Boost.multi_index
저장할 객체                       캐릭터 ID 로 검색

                                                                              캐릭터 이름으로 검색
// 컨테이너의 키를 선언
typedef boost::multi_index::member<Character, int, &Character::m_nCharID> IDX_CHARID;
typedef boost::multi_index::member<Character, std::wstring, &Character::m_strName> IDX_NAME;

// 인덱싱 타입을 선언
typedef struct indices : public boost::multi_index::indexed_by
              <
                            boost::multi_index::hashed_unique<IDX_CHARID>
                            , boost::multi_index::hashed_unique<IDX_NAME>
              >
{
              enum INDEX
              {
                            IDX_UNIQUE_CHARID                      =0
                            , IDX_UNIQUE_NAME
                            , IDX_END
              };
} INDICES;
인덱스의 종류


                  type                         specifier
                                        ordered_unique
                              ordered
                                        ordered_non_unique
  key-based
                                        hashed_unique
                              hashed
                                        hashed_non_unique
                                        sequenced
              non key-based
                                        random_access
인덱스 성능


                       삽입             삭제               기능
 ordered_unique       O(log N)         O(1)        set, multiset,
 ordered_non_unique                                map, multimap
 hashed_unique         O(1)            O(1)        unordered_set,
 hashed_non_unique                                 unordered_map
 sequenced             O(1)            O(1)             list
 random_access         O(1)      O( 뒤에 있는 요소 수 )       vector
컨테이너
<boost/multi_index_container.hpp>                multi_index_container 를 사용한다
                                              인덱스

                                                 set 이나 map 과 같이 정렬되는 인덱스를 사용한다
<boost/multi_index/ordered_index.hpp>
                                                 ordered_unique, ordered_non_unique

                                                 해쉬 키를 가진 인덱스를 사용한다
<boost/multi_index/hashed_index.hpp>
                                                 hashed_unique, hashed_non_unique

                                                 list 와 같은 순번 대로 접근하는 인덱스를 사용한다
<boost/multi_index/sequenced_index.hpp>
                                                 sequenced

                                                 vector 와 같이 임의 접근이 가능한 인덱스를 사용한다
<boost/multi_index/random_access_index.hpp>
                                                 random_access

                                              정렬 방법

<boost/multi_index/key_extractors.hpp>           아래의 모든 헤더 파일을 포함한다

<boost/multi_index/identity.hpp>                 요소의 클래스 ( 인스턴스 ) 끼리 비교하는 경우 필요

<boost/multi_index/member>                       요소의 멥버 변수를 비교하는 경우에 필요

<boost/multi_index/mem_fun.hpp>                  요소의 멤버 함수를 비교하는 경우에 필요

<boost/multi_index/global_fun.hpp>               전역 함수로 비교하는 경우에 필요

<boost/multi_index/composite_key.hpp>            복수의 조건으로 비교하는 경우 필요
template<
   typename Value,
   typename IndexSpecifierList=indexed_by<ordered_unique<identity<Value>
> >,
   typename Allocator=std::allocator<Value>
>
class multi_index_container;
Key 종류


 identity
 member
 const_mem_fun
 mem_fun
 global_fun
 composite_key
Demo
 Tutorial 1
  std::list && std::multiset

 Tutorial 2
  std::vector &&
  std::multiset

 Tutorial 3
  가독성 UP!

 Tutorial 7
  replace

 Tutorial 8
  modify

 Tutorial 9
  member_offset
공식 문서
http://www.boost.org/doc/libs/1_47_0/libs/multi_index/doc/

핵심 정리
( 일어 )http://www24.atwiki.jp/reisiki/pages/59.html

[Sdc 3rd] Boost multi_index

  • 1.
    Boost.multi_index 최흥배 Twitter : @jacking75 E-mail : jacking75@gmail.com 주체 : 온라인 서버 개발자 모임 후원 : 넷텐션
  • 2.
    multi_index multi :다양한 index : 색인
  • 3.
    class Character { Key INT32 m_nCharID; Key wstring m_strName; INT16 nLevel; INT32 nMoney; ..... };
  • 4.
    std::map<INT32, Character> m_CharSetByCharID std::map<wstring,Character> m_CharSetByName m_CharSetByCharID.insert m_CharSetByName.insert m_CharSetByName.erase m_CharSetByCharID.erase
  • 5.
    struct Character std::map<INT32, Character> m_CharSetByCharID { INT32 nCharID; std::map<wstring, Character> m_CharSetByName wstring strName; INT16 nLevel; m_CharSetByCharID.insert INT32 nMoney; m_CharSetByName.insert ..... }; m_CharSetByName.erase m_CharSetByCharID.erase Key 는 2 개이지만 둘 다 하나의 객체를 가리킨다 실수로 m_CharSetByCharID 나 m_CharSetByName 중 한쪽만 추가를 하던가 , 또는 한쪽만 삭제를 한다면
  • 7.
  • 9.
  • 10.
    저장할 객체 캐릭터 ID 로 검색 캐릭터 이름으로 검색 // 컨테이너의 키를 선언 typedef boost::multi_index::member<Character, int, &Character::m_nCharID> IDX_CHARID; typedef boost::multi_index::member<Character, std::wstring, &Character::m_strName> IDX_NAME; // 인덱싱 타입을 선언 typedef struct indices : public boost::multi_index::indexed_by < boost::multi_index::hashed_unique<IDX_CHARID> , boost::multi_index::hashed_unique<IDX_NAME> > { enum INDEX { IDX_UNIQUE_CHARID =0 , IDX_UNIQUE_NAME , IDX_END }; } INDICES;
  • 11.
    인덱스의 종류 type specifier ordered_unique ordered ordered_non_unique key-based hashed_unique hashed hashed_non_unique sequenced non key-based random_access
  • 12.
    인덱스 성능 삽입 삭제 기능 ordered_unique O(log N) O(1) set, multiset, ordered_non_unique map, multimap hashed_unique O(1) O(1) unordered_set, hashed_non_unique unordered_map sequenced O(1) O(1) list random_access O(1) O( 뒤에 있는 요소 수 ) vector
  • 13.
    컨테이너 <boost/multi_index_container.hpp> multi_index_container 를 사용한다 인덱스 set 이나 map 과 같이 정렬되는 인덱스를 사용한다 <boost/multi_index/ordered_index.hpp> ordered_unique, ordered_non_unique 해쉬 키를 가진 인덱스를 사용한다 <boost/multi_index/hashed_index.hpp> hashed_unique, hashed_non_unique list 와 같은 순번 대로 접근하는 인덱스를 사용한다 <boost/multi_index/sequenced_index.hpp> sequenced vector 와 같이 임의 접근이 가능한 인덱스를 사용한다 <boost/multi_index/random_access_index.hpp> random_access 정렬 방법 <boost/multi_index/key_extractors.hpp> 아래의 모든 헤더 파일을 포함한다 <boost/multi_index/identity.hpp> 요소의 클래스 ( 인스턴스 ) 끼리 비교하는 경우 필요 <boost/multi_index/member> 요소의 멥버 변수를 비교하는 경우에 필요 <boost/multi_index/mem_fun.hpp> 요소의 멤버 함수를 비교하는 경우에 필요 <boost/multi_index/global_fun.hpp> 전역 함수로 비교하는 경우에 필요 <boost/multi_index/composite_key.hpp> 복수의 조건으로 비교하는 경우 필요
  • 14.
    template< typename Value, typename IndexSpecifierList=indexed_by<ordered_unique<identity<Value> > >, typename Allocator=std::allocator<Value> > class multi_index_container;
  • 15.
    Key 종류  identity member  const_mem_fun  mem_fun  global_fun  composite_key
  • 16.
  • 17.
     Tutorial 1 std::list && std::multiset  Tutorial 2 std::vector && std::multiset  Tutorial 3 가독성 UP!
  • 18.
  • 19.
     Tutorial 7 replace  Tutorial 8 modify  Tutorial 9 member_offset
  • 21.