発表タイトル: Rhetorical Programming

Similar documents
Boost.Preprocessor でプログラミングしましょう DigitalGhost

プログラミングI第10回

Microsoft Word - no206.docx

とても使いやすい Boost の serialization

Green with White Lines

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

Microsoft PowerPoint - prog03.ppt

Condition DAQ condition condition 2 3 XML key value

Microsoft Word - NonGenList.doc

Microsoft PowerPoint Java基本技術PrintOut.ppt [互換モード]

design_pattern.key

前回のあらすじ 物理演算ライブラリ chipmunk を使って チキンが地面に落ちるところまで

memo

基礎プログラミング2015

第 3 回 Java 講座 今回の内容 今週の Java 講座はコレクション 拡張 for 文, ガベージコレクションについて扱う. 今週の Java 講座は一番内容が薄いも のになるだろう. コレクション コレクションとは大きさが決まっていない配列だと考えればよい. コレクションには List 先

PowerPoint プレゼンテーション

Microsoft PowerPoint - prog04.ppt

C のコード例 (Z80 と同機能 ) int main(void) { int i,sum=0; for (i=1; i<=10; i++) sum=sum + i; printf ("sum=%d n",sum); 2

スライド 1

Microsoft PowerPoint - kougi9.ppt

第2回講義

About me! 足立昌彦 / +Masahiko.Adachi )! バイドゥ株式会社技術顧問 (Simeji)! 株式会社カブク Co-Founder! Google Developer Expert (Android)

VB.NETコーディング標準

プログラミング入門1

PowerPoint Template

Microsoft PowerPoint ppt

Microsoft PowerPoint - kougi10.ppt

PowerPoint プレゼンテーション

O(N) ( ) log 2 N

.NETプログラマー早期育成ドリル ~VB編 付録 文法早見表~

memo

(STL) STL 1 (deta structure) (algorithm) (deta structure) 2 STL STL (Standard Template Library) 2.1 STL STL ( ) vector<int> x; for(int i = 0; i < 10;

SpringSecurity

memo

Microsoft PowerPoint - chap10_OOP.ppt

Microsoft PowerPoint - ●SWIM_ _INET掲載用.pptx

JAVA入門

プログラミング基礎I(再)

プログラミング入門1

基礎計算機演習 実習課題No6

Microsoft PowerPoint - Pro110111

JAVA入門

今回のプログラミングの課題 ( 前回の課題で取り上げた )data.txt の要素をソートして sorted.txt というファイルに書出す ソート (sort) とは : 数の場合 小さいものから大きなもの ( 昇順 ) もしくは 大きなものから小さなもの ( 降順 ) になるよう 並び替えること

2. データ構造ヒープに保存するデータは 番号付けられて保存される 従って リスト L として保存することとする 3. アルゴリズム 3.1. 要素の追加新しい要素の追加は リストの終端に置くことで開始する つまり 最下層の一番右 または新たに最下層を生成してその一番左となる この後 この要素を正し

intra-mart Accel Platform — IM-Repository拡張プログラミングガイド   初版  

スライド 1

cpp2.dvi

ソフトゼミC 第二回 C++の基礎

PowerPoint プレゼンテーション

Microsoft Word - C言語研修 C++編 3.doc

Exam : 1z1-809-JPN Title : Java SE 8 Programmer II Vendor : Oracle Version : DEMO Get Latest & Valid 1z1-809-JPN Exam's Question and Answers 1 from Ac

DEMO1 まずはやってみよう アクティビティをダブルクリック 作成 - プロジェクト C# => Workflow CodeActivity をぽとぺ シーケンシャルと ステートマシン それぞれのコ ンソールアプリ あとライブラリがある びっくりマークは足りていないあかし プロパティをみると判別で

Microsoft PowerPoint - 08LR-conflicts.ppt [互換モード]

PowerPoint プレゼンテーション

Slide 1

Microsoft Word - NonGenTree.doc

4-3- 基 C++ に関する知識 オープンソースシステムのソースを解読する上で C++ の知識は必須であるといえる 本カリキュラムでは まずオブジェクト指向に関する Ⅰ. 概要理解を深め クラスの扱い方について学習し STL を使用してアルゴリズムとデータ構造を実装する方法を学習する Ⅱ. 対象専

PowerPoint プレゼンテーション

1. はじめに 二分木ヒープ 様々なアルゴリズムにおいて ある要素の集合またはリストから 最小 な要素を取り 出す必要がある そのような場合に使われる標準的データ構造が二分木ヒープ (binary heap) である あるオブジェクトO を考える そのオブジェクトは ラベル O. label と値

Javaセキュアコーディングセミナー東京 第2回 数値データの取扱いと入力値の検証 演習解説

バイオプログラミング第 1 榊原康文 佐藤健吾 慶應義塾大学理工学部生命情報学科

JAVA入門

Microsoft Word - Android_SQLite講座_画面800×1280

PowerPoint プレゼンテーション

Microsoft PowerPoint - class2-OperatorOverLoad.pptx

Sinatra と MongoDB 今回は Sinatra で MongoDB の操作を体験してみます 進捗に合わせて ドライバから Ruby で使える便利な ORM の紹介をします

解きながら学ぶC++入門編

Java から見たオブジェクト指向入門 オブジェクト指向 AtoZ セミナー ( 株 ) 豆蔵井上樹

Program Design (プログラム設計)

cpp1.dvi

スライド 1

Taro-リストⅠ(公開版).jtd

平成 29 年度卒業研究 初心者のためのゲームプログラミング用 教材の開発 函館工業高等専門学校生産システム工学科情報コース 5 年 25 番細見政央指導教員東海林智也

Microsoft PowerPoint - handout07.ppt [互換モード]

PowerPoint プレゼンテーション

GEC-Java

Microsoft Word - no15.docx

3.1 stdio.h iostream List.2 using namespace std C printf ( ) %d %f %s %d C++ cout cout List.2 Hello World! cout << float a = 1.2f; int b = 3; cout <<

プログラミング入門1

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版   None

グラフの探索 JAVA での実装

ガイダンス

Microsoft Word - no06.doc

Prog2_12th

始めに, 最下位共通先祖を求めるための関数 LcaDFS( int v ) の処理を記述する. この関数は値を返さない再帰的な void 関数で, 点 v を根とする木 T の部分木を深さ優先探索する. 整数の引数 v は, 木 T の点を示す点番号で, 配列 NodeSpace[ ] へのカーソル

V8.1新規機能紹介記事

プログラミング方法論 II 第 14,15 回 ( 担当 : 鈴木伸夫 ) 問題 17. x 座標と y 座標をメンバに持つ構造体 Point を作成せよ 但し座標 は double 型とする typedef struct{ (a) x; (b) y; } Point; 問題 18. 問題 17 の

JAVA とテンプレート

解答上の注意 1 解答は 解答 紙の問題番号に対応した解答欄にマークしなさい 2 選択肢は 問ごとに 意されています 問 1の選択肢は 問 2で使 しません 3 選択肢は量が多いため 探しやすさの観点よりグループ分けされています グループ分けに合わせて解答欄が区切られていますが 横 1 列で問題 1

Microsoft PowerPoint - lec10.ppt

r08.dvi

メソッドのまとめ

基礎プログラミング2015

PowerPoint プレゼンテーション

RX600 & RX200シリーズ アプリケーションノート RX用仮想EEPROM

第 2 章インタフェース定義言語 (IDL) IDL とは 言語や OS に依存しないインタフェース定義を行うためのインタフェース定義言語です CORBA アプリケーションを作成する場合は インタフェースを定義した IDL ファイルを作成する必要があります ここでは IDL の文法や IDL ファイ

CプログラミングI

intra-mart Accel Platform — イベントナビゲータ 開発ガイド   初版  

構造体

Transcription:

Boost.Intrusive Boost.MultiIndex k.inaba ( 稲葉一浩 ) http://www.kmonos.net/ Boost. 勉強会 Dec 12, 2009

k.inaba といいます 2/68 こんなことやってます

今日お話したい内容 3/68 僕は データ構造 が好きです

Boost のすごいデータ構造 その 1 Boost.MultiIndex

日本語で言うと 5/68 Multi: 複数の Index: 索引

6/68 お題 : 今日の発表リスト #include <list> struct Presen { string twitterid; // ツイッター ID string hatenaid; // はてなID string title; // 発表題目 }; std::list<presen> timetable;

お題 : 今日の発表リスト作ろう 7/68 #include <boost/assign.hpp> timetable += Presen( cpp_akira, faith_and_brave, Boostライブラリ一週の旅 );

お題 : 今日の発表リスト作ろう 8/68 timetable += Presen( kinaba, cafelier, Boost.MultiIntrusivedex );

お題 : 今日の発表リスト作ろう 9/68 timetable += Presen( melponn, melpon, Boost.Coroutine ); 以下略

10/68 作ったデータを使おう! さんの発表タイトルって なんだったっけ? twid_to_title( timetable, DecimalBloat ) == Boost.Preprocessor

11/68 こうだ! #include <boost/foreach.hpp> string twid_to_title(tt, id) { BOOST_FOREACH(Presen& p, tt) if( p.twitterid == id ) return p.title; throw std::out_of_range(id); }

12/68 こうだ! #include <boost/foreach.hpp> string twid_to_title(tt, id) { BOOST_FOREACH(Presen& p, tt) if( p.twitterid == id ) return p.title; throw std::out_of_range(id); }

Boost 勉強会発表者 13/68 未来予測

14/68 発表者 300 億人に スケールするには?

15/68 データ構造を変えれば std::set なら 検索が速い! struct ByTwID { bool operator()( 略 ) { 略 } }; // std::list<presen> std::set<presen,bytwid> timetable;

16/68 1 億倍速い! string twid_to_title(tt, id) { auto it = tt.find(presen(twid,, )); if( it!= tt.end() ) return it->title; throw std::out_of_range(twid); }

17/68 1 億倍速い! string twid_to_title(tt, id) { auto it = tt.find(presen(twid,, )); if( it!= tt.end() ) return it->title; throw std::out_of_range(twid); }

18/68 なんで不合格? (1) Twitter ID じゃなくて はてな ID でも検索したい! hatenaid_to_title( timetable, xyuyux ) == Boost.Asio

19/68 なんで不合格? (2) 発表の順番も知りたい! BOOST_FOREACH(Presen& p, timtbl) cout << p.title << endl; // set だと ID の順に並んでしまう // - Boost.SmartPtr:shared_ptr+weak_ptr // - Boost.Preposessor // - Boost. ライブラリ一週の旅

20/68 ここまでの要望をまとめる Twitter ID で 高速検索できて はてな ID で 高速検索できて 表に入れた順番も 覚えとけ!

21/68 そんな Boost.MultiIndex あなたに

typedef multi_index_container<presen, indexed_by< ordered_unique< 22/68 こうだ! member<presen,string,&presen::twitterid> >, ordered_unique< member<presen,string,&presen::hatenaid> >, sequenced<> > > MyTimeTable; 入れた順も覚えといて! 入れる物は Presen.twitterID で検索したい.hatenaID で検索したい

23/68 mi<presen,index<tw,ht,seq>> // get<0> // twitteridで // 高速検索 timetable.get<0>().find( wraith13 );

24/68 mi<presen,index<tw,ht,seq>> timetable.get<1>().find( Cryolite ); // get<1> // はてな ID で // 高速検索

25/68 mi<presen,index<tw,ht,seq>> // get<2> 入れた順 BOOST_FOREACH( const Presen& p, timetable.get<2>() ) cout << p.title << endl;

26/68 FAQ よくある 質問

27/68 FAQ 3 つデータ構造 作るのと 何が違うの?

28/68 つまり これとの違いは? struct MyTimeTable { set<presen, ByTwID> tt1; set<presen, ByHatenaID> tt2; list<presen> tt3; void add(const Presen& p) { tt1.insert(p); tt2.insert(p); tt3.push_back(p); } };

29/68 つまり これとの違いは? struct MyTimeTable { set<presen, ByTwID> tt1; set<presen, ByHatenaID> tt2; list<presen> tt3; void add(const Presen& p) { tt1.insert(p); tt2.insert(p); tt3.push_back(p); } };

30/68 インデックスの更新 @kinaba です 用事入った ので発表キャンセル! tt1.erase(presen( kinaba,, )); tt2.erase( 略 ); tt3.erase( 略 ); 遅い!

31/68 インデックスの更新 MultiIndex なら tt.get<0>().erase( kinaba ); 1 行 & 一瞬

32/68 用意されてるインデックス 挿入削除機能 ordered_unique ordered_non_unique O(log N) O(1) set, multiset: 指定キーで検索 hashed_unique hashed_non_unique O(1) O(1) unordered_set 等 : 指定キーでハッシュ検索 sequenced O(1) O(1) list: 入れた順を覚える random_access O(1) O( 後続要素数 ) vector: ランダムアクセス

33/68 MultiIndex の便利な所まとめ 色んなインデックスを付けられる tt.get<0>().erase( uskz ); BOOST_FOREACH(p, tt.get<2>()) { } 整数 0, 1, 2, でなく タグも付けられます struct oreore {}; // てきとうな型 multi_index_container<t, indexed_by<, sequenced<tag<oreore>> > tt; tt.get<oreore>();

34/68 MultiIndex の便利な所まとめ 実はむしろ普通のコンテナより便利 find(key), modify( ) set_tt.find(presen( uskz,, )); vs mi_tt.find( uskz );

Boost のすごいデータ構造 その 2 Boost.Intrusive こちらスネーク Boost への 侵入に成功した / / / _ / / / し し J

36/68 日本語で言うと intrusive = 侵入的

37/68 普通のデータ構造 構造の管理用メンバは 外 struct Presen { string twitterid; string hatenaid; string title; }; struct _List_node { _List_node* prev; _List_node* next; Presen data; }; std::list<presen> lst;

38/68 侵入的データ構造 管理用メンバが 侵入 struct Presen { list_member_hook<> hook; string twitterid; string hatenaid; string title; }; intrusive::list<presen, > lst; / / / _ / / / し し J

39/68 メリット & デメリット デメリット [Bad] データ定義がコンテナに依存しちゃう hook を自分で置く手間がかかる メリット [Good] コピー不可オブジェクトも入れられる 複数のコンテナに同時に入れられる 実は MultiIndex 的なことができる

40/68 メリット & デメリット デメリット 今日は [Bad] データ定義がコンテナに依存しちゃう hook を自分で置く手間がかかる 細かい話は メリット [Good] コピー不可オブジェクトも入れられる 複数のコンテナに同時に入れられる 実は MultiIndex 的なことができる スキップ

41/68 データ構造マニア的 Boost.Intrusive の 特徴

異様に set の種類が多い 42/68 STL MultiIndex Intrusive vector deque slist random_access slist list sequenced list set ordered set unordered_set hashed unordered_set avl_set splay_set sg_set treap_set

43/68 マニア心をくすぐる set set 挿入 : 速い検索 : 遅い avl_set 挿入 : 遅い検索 : 速い sg_set 実行時 ハ ランス切替 splay_set よく使う要素 : 速い treap_set 優先度つけられる

Boost のすごいデータ構造 その 3 まぜてみよう! こちらスネーク MultiIndex への 侵入に成功した / / / _ / / / し し J

45/68 すごいところ MultiIndex は 入れるデータに手を加えずに複数のインデックス張れて凄い Intrusive は sg_set とか splay_set とか色々あってすごい

46/68 あわせると? もっとすごい!

47/68 というわけで目標 Intrusive を使って MultiIndex 用インデックス avl<> sg<> splay<> treap<> を実装します

48/68 インデックスの作り方調べ中 将来やりたいなーと思ってる事 User-defined indices ユーザもインデックスを定義できるようにする The mechanisms by which Boost.MultiIndex orchestrates the operations of the indices held by a multi_index_container are simple enough to make them worth documenting so that the (bold) user can write implementations for her own indices. もしかして : 今はまだできない

49/68 インデックスの作り方調べ中 整理はされてる! 将来やりたいなーと思ってる事 ( ドキュメントないけど!) User-defined indices ユーザもインデックスを定義できるようにする The mechanisms by which Boost.MultiIndex orchestrates the operations of the indices held by a multi_index_container are simple enough to make them worth documenting so that the (bold) user can write implementations for her own indices. もしかして : 今はまだできない

50/68 というわけで この後の発表内容は 私がソースから勝手に解釈した方法 色々間違ってるかも 将来的に色々変わるかも

51/68 1 そもそも 複数のインデックス の実体は?

52/68 class index_node_base { T value; } mi<t,index<tw,ht,seq>> のノート こんなノードクラス class node_type { } node_type*twl,*twr; redblack twc; node_type*htl,*htr; redblack htc; node_type *prev; node_type *next; T value; 正確には継承で class { seqnode* next; seqnode* prev; } class { htnode *L, *R; redblack C; } class node_type { node_type *L,*R; redblack C; }

53/68 2 俺々ノード の 実装

54/68 intrusive::sg_set の場合 親クラスを外から指定可にする template<typename Super> struct my_node : public Super { sg_set_member_hook<> hook_; }; あとは好きなように実装 コンストラクタ呼ばれないので注意

55/68 3 次に インデックス本体 の実体

class ( 順番保存用 ) : { push_back,begin,end, } protected class ( はてな ID 検索用 ) : { find,erase,begin,end, } protected class (TWitterID 検索用 ): { find,erase,begin,end, } public 56/68 これも継承 protected class index_base{ } class multi_index_container : { public: twindex& get<0>() { return *this; } htindex& get<1>() { return *this; } seqindex& get<2>() { return *this; } }

57/68 4 俺々インデックス の 実装

58/68 intrusive::sg_set の場合 親クラスを外から指定可にする template<class Meta, class Tag> struct my_index : protected Meta::type { // ここで必須 typedefを大量定義 // ここで必須メソッドを実装する sg_set<my_node< >> impl_; }; あとは好きなように実装

59/68 5 次に コンテナ的メソッド の実装

60/68 例 pop_back ( 最後の要素を消す )

61/68 class my_index : { void pop_back() { { my_node* p = 気合い ; final_erase_(p); } void erase_(my_node* p) { impl_.erase( 気合 (p)); super::erase_(p); }} いろいろなインデックス class index_base { final_erase_(p){ ((mi*)this) ->erase_(p); }} いろいろなインデックス class multi_index_container : { void erase_(node* p){super::erase_(p);} }

62/68 実装に使えるメソッド bool final_empty_() size_t final_size_() size_t final_max_size_() pair<fnode*,bool> final_insert_(value) pair<fnode*,bool> final_insert_(value, fnode*) void final_erase_(fnode*) void final_delete_node_(fnode*) void final_delete_all_nodes_() void final_clear_() void final_swap_(final&) bool final_replace_(value, fnode*) bool final_modify_(modifier mod, fnode*) bool final_modify_(modifier mod, ROLLBACK back, fnode*)

63/68 実装しないといけないメソッド void copy_(const self&,const copy_map_type&) node* insert_(value, node*) node* insert_(value, node* position, node*) void erase_(node*) void delete_node_(node*) void delete_all_nodes_() void clear_() void swap_() bool replace_(value, node*) bool modify_(node*) bool modify_rollback_(node*)

64/68 6 最後に IndexSpecifier

65/68 IndexSpecifier って何? multi_index_container<presen, indexed_by< ここに並べるもの > >

66/68 IndexSpecifier って何? multi_index_container<presen, indexed_by<use_my_index<>> ここに並べるもの > > template<typename Tag=tag<>> struct use_my_index { template<typename Super> struct node_class { typedef my_node<super> type; }; template<typename Meta> struct index_class { typedef my_index<meta,tag> type; } };

67/68 7 完成!

68/68 Thank You for Listening! / / / _ / / / し し J http://github.com/kinaba/mint