SlideShare una empresa de Scribd logo
1 de 21
Descargar para leer sin conexión
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 4
  유저 정의형 타입 사용

 Tutorial 5
  유저 정의형 타입 && 멤버 함수 키 && 합성 키 &&
  bound

 Tutorial 6
  유저 정의형 타입 && std::multiset && std::map
 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

Más contenido relacionado

La actualidad más candente

Bases de données réparties par la pratique
Bases de données réparties par la pratiqueBases de données réparties par la pratique
Bases de données réparties par la pratiqueAbdelouahed Abdou
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications JavaAntoine Rey
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Ippon
 
초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHub초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHubYurim Jin
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자NAVER D2
 
BigData_TP4 : Cassandra
BigData_TP4 : CassandraBigData_TP4 : Cassandra
BigData_TP4 : CassandraLilia Sfaxi
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!pyrasis
 
[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩NHN FORWARD
 
Présentation DEVOPS.pptx
Présentation DEVOPS.pptxPrésentation DEVOPS.pptx
Présentation DEVOPS.pptxboulonvert
 
Examen sybase - Administration base de donnees
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donneeswebreaker
 

La actualidad más candente (20)

Bases de données réparties par la pratique
Bases de données réparties par la pratiqueBases de données réparties par la pratique
Bases de données réparties par la pratique
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
 
초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHub초보자를 위한 Git & GitHub
초보자를 위한 Git & GitHub
 
Java RMI
Java RMIJava RMI
Java RMI
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자[131]chromium binging 기술을 node.js에 적용해보자
[131]chromium binging 기술을 node.js에 적용해보자
 
BigData_TP4 : Cassandra
BigData_TP4 : CassandraBigData_TP4 : Cassandra
BigData_TP4 : Cassandra
 
Intro docker
Intro dockerIntro docker
Intro docker
 
Cours JavaScript
Cours JavaScriptCours JavaScript
Cours JavaScript
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
Introduction au langage SQL
Introduction au langage SQLIntroduction au langage SQL
Introduction au langage SQL
 
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
도커 무작정 따라하기: 도커가 처음인 사람도 60분이면 웹 서버를 올릴 수 있습니다!
 
Présentation Docker
Présentation DockerPrésentation Docker
Présentation Docker
 
[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩[2019] 200만 동접 게임을 위한 MySQL 샤딩
[2019] 200만 동접 게임을 위한 MySQL 샤딩
 
Présentation DEVOPS.pptx
Présentation DEVOPS.pptxPrésentation DEVOPS.pptx
Présentation DEVOPS.pptx
 
Redis
RedisRedis
Redis
 
Examen sybase - Administration base de donnees
Examen sybase - Administration base de donneesExamen sybase - Administration base de donnees
Examen sybase - Administration base de donnees
 
Introduction à Laravel
Introduction à LaravelIntroduction à Laravel
Introduction à Laravel
 

Destacado

Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11OnGameServer
 
MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서OnGameServer
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프OnGameServer
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows TerminalOnGameServer
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기OnGameServer
 
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기OnGameServer
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축OnGameServer
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기OnGameServer
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game serverOnGameServer
 
SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기OnGameServer
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍OnGameServer
 
이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기OnGameServer
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기OnGameServer
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기OnGameServer
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기OnGameServer
 
一起分享吧
一起分享吧一起分享吧
一起分享吧Emma Chang
 

Destacado (20)

Boost 라이브리와 C++11
Boost 라이브리와 C++11Boost 라이브리와 C++11
Boost 라이브리와 C++11
 
MinWin에 대해서
MinWin에 대해서MinWin에 대해서
MinWin에 대해서
 
Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프Windows os 상에서 효율적인 덤프
Windows os 상에서 효율적인 덤프
 
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
게임 개발에 도움을 주는 CruiseControl.NET과 Windows Terminal
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
안준석님 - 안드로이드 프로세스들의 통신 메커니즘 : 바인더 이야기
 
Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축Microsoft SharePoint를 활용한 개발환경 구축
Microsoft SharePoint를 활용한 개발환경 구축
 
해외 취업 이야기
해외 취업 이야기해외 취업 이야기
해외 취업 이야기
 
Multi thread game server
Multi thread game serverMulti thread game server
Multi thread game server
 
SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기SDC 3rd 안중원님 - InGame CashShop 개발 하기
SDC 3rd 안중원님 - InGame CashShop 개발 하기
 
IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍IPv6 이론과 소켓 프로그래밍
IPv6 이론과 소켓 프로그래밍
 
이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기이욱진님 - 메모리 관리자로부터 배우기
이욱진님 - 메모리 관리자로부터 배우기
 
초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기초보자를 위한 분산 캐시 이야기
초보자를 위한 분산 캐시 이야기
 
Mongo db 시작하기
Mongo db 시작하기Mongo db 시작하기
Mongo db 시작하기
 
임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기임영기님 - 코드 리뷰 시스템 도입하기
임영기님 - 코드 리뷰 시스템 도입하기
 
Dream
DreamDream
Dream
 
3亭賢結婚
3亭賢結婚3亭賢結婚
3亭賢結婚
 
一起分享吧
一起分享吧一起分享吧
一起分享吧
 
Saruulbuyn
SaruulbuynSaruulbuyn
Saruulbuyn
 
Trimax | reclamefotografen food fotografie
Trimax | reclamefotografen food fotografieTrimax | reclamefotografen food fotografie
Trimax | reclamefotografen food fotografie
 

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.  Tutorial 4 유저 정의형 타입 사용  Tutorial 5 유저 정의형 타입 && 멤버 함수 키 && 합성 키 && bound  Tutorial 6 유저 정의형 타입 && std::multiset && std::map
  • 19.  Tutorial 7 replace  Tutorial 8 modify  Tutorial 9 member_offset
  • 20.