SlideShare a Scribd company logo
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

More Related Content

More from 흥배 최

Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
흥배 최
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
흥배 최
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
흥배 최
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
흥배 최
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
흥배 최
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
흥배 최
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
흥배 최
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심흥배 최
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
흥배 최
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
흥배 최
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
흥배 최
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
흥배 최
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
흥배 최
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임흥배 최
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기흥배 최
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서흥배 최
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템흥배 최
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용흥배 최
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability흥배 최
 

More from 흥배 최 (20)

Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용Twitter의 snowflake 소개 및 활용
Twitter의 snowflake 소개 및 활용
 
Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]Go web framework 비교[번역 정리]
Go web framework 비교[번역 정리]
 
Bash on Ubuntu on Windows
Bash on Ubuntu on WindowsBash on Ubuntu on Windows
Bash on Ubuntu on Windows
 
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
잘 알려지지 않은 숨은 진주, Winsock API - WSAPoll, Fast Loopback
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Wtl 개요와 설치
Wtl 개요와 설치Wtl 개요와 설치
Wtl 개요와 설치
 
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
KGC2015_C# 스크립트를 사용한 게임서버 모니터링 시스템개발
 
Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심Modern C++ 프로그래머를 위한 CPP11/14 핵심
Modern C++ 프로그래머를 위한 CPP11/14 핵심
 
NLog 소개
NLog 소개NLog 소개
NLog 소개
 
닷넷 Apache avro
닷넷 Apache avro닷넷 Apache avro
닷넷 Apache avro
 
Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개Mongodb2.2와 2.4의 신 기능 소개
Mongodb2.2와 2.4의 신 기능 소개
 
Mongodb 관리
Mongodb 관리Mongodb 관리
Mongodb 관리
 
Mongodb 개발 포인트
Mongodb 개발 포인트Mongodb 개발 포인트
Mongodb 개발 포인트
 
NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션NET 최선단 기술에 의한 고성능 웹 애플리케이션
NET 최선단 기술에 의한 고성능 웹 애플리케이션
 
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임ASP.NET과 C#으로 개발하는 대규모 소셜 게임
ASP.NET과 C#으로 개발하는 대규모 소셜 게임
 
닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기닷넷프레임워크에서 Redis 사용하기
닷넷프레임워크에서 Redis 사용하기
 
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
Twitter의 대규모 시스템 운용 기술 어느 고래의 배속에서
 
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
Twitter에 있어서 대규모 시스템 구성, 3개의 원칙과 시스템
 
MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용MongoDB 모바일 게임 개발에 사용
MongoDB 모바일 게임 개발에 사용
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 

[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 중 한쪽만 추가를 하던가 , 또는 한쪽만 삭제를 한다면
  • 6.
  • 8.
  • 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. Demo
  • 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
  • 20.