SlideShare uma empresa Scribd logo
1 de 19
Baixar para ler offline
Boost.Container特有の機能
高橋 晶(Akira Takahashi)
faithandbrave@longgate.co.jp
2015/05/30 Boost.勉強会 #17 東京
自己紹介 1/2
• 高橋 晶(Akira Takahashi)
• システム系とかゲーム系とか、いろいろな開発をやってます。
• 最近は、プロ向けの教育の仕事とか、Emscriptenを使って
C++でブラウザゲームを作っていたりしました。
自己紹介 2/2
• 著書: 『C++テンプレートテクニック』

『C++ポケットリファレンス』『プログラミングの魔導書』
シリーズ
• C++の日本語リファレンスサイトcpprefjpを作っています。
• Boostの日本語情報サイトboostjpを作っています。
• そのほか、たまにBoostにpull requestを投げたりしています
C++ポケットリファレンス
• C++14に対応した第2版は、2015年6月4日(木)に発売です
本日のお題:Boost.Container
• この発表では、Boostのコンテナライブラリについて

話します。
• Boost.Containerには、標準ライブラリとほとんど同じ機能
が入っているため、あまり使われていないように思います。
• しかし実際には、標準ライブラリよりもこちらを使った方が
いい、というような機能が多々入っています。
• 今回の発表では、Boost.Container特有の便利な機能を

紹介していきます。
Boost.Containerとは
• 作者Ion Gaztañaga
• C++標準化委員会で、コンテナ関係の仕様を決めてる人
• 標準コンテナの最新仕様を、標準規格の更新を待たず、

すぐに試せることを目的としたライブラリ。
• この発表では、C++11標準コンテナの知識を前提として、
Boost.Containerの拡張機能やその他特徴を紹介します。
話すこと
• あらゆる環境向けに、ひとつの実装
• 標準以外のコンテナ
• 要素のデフォルト値を未初期化にする
• realloc機能に対応したアロケータ
• 例外送出のカスタマイズ
• 連想コンテナの拡張オプション
あらゆる環境向けに、ひとつの実装
標準コンテナは、環境ごとにコンテナの実装が異なる。
Boost.Containerでは実装がひとつなので、以下のようなことを期待して
使用できる:
• メモリ確保する場所・条件が一定
• たとえば、デフォルトコンストラクタはメモリ確保しない

(なので、例外を送出しない)
• basic_stringのSmall String Optimization
• 短い文字列については、スタックを使用する
• ただし、デフォルトのメモリアロケータは、環境ごとの
mallocを使用するので、パフォーマンスは一定ではない
標準以外のコンテナ 1/5
Boost.Containerには、標準ライブラリにはない拡張コンテナが
いくつか用意されている
• stable_vector
• flat_map/flat_set
• static_vector
• small_vector
標準以外のコンテナ 2/5
stable_vector
• vectorとlistのハイブリッド
• 伸長や消去をした際に、イテレータと参照が無効にならない
• メモリが連続していない
• 定数時間でランダムアクセスできる
標準以外のコンテナ 3/5
flat_map / flat_set
• ソート済みvectorとしての、順序付き連想コンテナ
• ツリー構造ではないからflat(平坦)
• イテレーションが標準連想コンテナよりも高速
• メモリ消費が標準連想コンテナよりも小さい
• 検索は対数時間
標準以外のコンテナ 4/5
static_vector
• 動的メモリ確保せず、スタックを使用するvector
• 第2テンプレート引数で、最大の要素数を指定して、それを

超えないように使用する。超えたらbad_alloc例外。
boost::container::static_vector<int, 3> v; // 3要素まで伸長できる
!
// 要素の追加
v.push_back(3);
v.push_back(1);
v.push_back(4); // 4回目は、やってはいけない
!
for (int x : v) {
std::cout << x << std::endl;
}
標準以外のコンテナ 5/5
small_vector
• 小さい要素数に特化したvector。
• 第2テンプレート引数で、事前にメモリ確保する要素数を指
定する。その要素数を超えたら再確保。
boost::container::small_vector<int, 3> v; // 3要素分を事前にメモリ確保
!
v.push_back(3);
v.push_back(1);
v.push_back(4); // ここまで、メモリの再確保なし
!
for (int x : v) {
std::cout << x << std::endl;
}
要素のデフォルト値を未初期化にする
namespace cont = boost::container;
!
// 要素数を3個で構築
cont::vector<int> v(3, cont::default_init);
!
// 要素数を4に伸長する
v.resize(4, cont::default_init);
• vectorのresize()は、伸ばした分の要素を、値初期化する
• 巨大な動的配列を作る際には、値初期化のコストが無視できなくなる
• Boost.Containerのvectorは、要素を未初期化にする拡張を提供して
いる
realloc機能に対応したアロケータ
namespace cont = boost::container;
cont::vector<int, cont::allocator<int, 2>> v;
!
v.reserve(3);
v.push_back(3);
v.push_back(1);
v.push_back(4);
v.push_back(5); // メモリ領域を伸長する
• vectorは、要素を伸長した際に、キャパシティを超えたら別な場所に、

より大きな領域を確保して要素を移動する。
• boost::container::allocator<T, 2>を使用すると、

realloc相当の機能で、いま確保しているメモリ領域を伸ばしてくれる。
• この機能は、dlmallocを改良して実装されている。
詳細は、Boost.勉強会 #15 札幌での、池田さんの発表を参照。
例外送出のカスタマイズ
• Boost.Containerは、例外送出について、いくつかのカスタマイズ方法を提供している
• BOOST_NO_EXCEPTIONSをdefineする
• 例外送出のところで、std::abort()を呼び出して異常終了する
• BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKSをdefineする
• 例外の送出方法を自分で決める
• これによって、例外発生時に、ログやバックトレース等を埋め込める
#define BOOST_CONTAINER_USER_DEFINED_THROW_CALLBACKS
#include <boost/container/vector.hpp>
!
namespace boost { namespace container {
void throw_out_of_range(const char* str) // カスタマイズ用のハンドラ
{
output_log(str); // ログ出力
throw std::out_of_range(str);
}
}}
連想コンテナの拡張オプション
• Boost.Containerの順序付き連想コンテナは、

ツリー構造のオプションを指定できる。
using namespace boost::container;
!
// AVL木を使用する
using AvlTree = tree_assoc_options< tree_type<avl_tree> >::type;
using AvlSet = set<int, std::less<>, AVLTree>;
!
// スプレー木を使用する
// 最近アクセスした要素に、高速にアクセスできる(償却対数時間)
using SplayTree = tree_assoc_options< tree_type<splay_tree> >::type;
using SplaySet = set<int, std::less<>, SplayTree>;
!
// スケープゴート木を使用する
// 挿入と削除が償却対数時間になる
using ScapegoatTree = tree_assoc_options< tree_type<scapegoat_tree> >::type;
using ScapegoatSet = set<int, std::less<>, ScapeGoatTree>;
そのほか
• vector<bool>の特殊化はありません。設計ミスと言われて

いる機能は、Boost.Containerでは採用していません。
• C++1zで採用予定の、「不完全型のサポート」が、
static_vectorとbasic_string以外に対して入っています。
• Boost.Interprocessと組み合わせることで、ファイルとの

メモリマップができます。

オンメモリに乗らない巨大なデータを扱えます。
まとめ
• Boost.Containerには、いろいろな場面で役立つ機能が多々
入っています。
• スタックを使用するstatic_vectorはよく使いますし、

例外送出のカスタマイズは、何かあったときに、痒いところ
に手が届いてくれて便利です。
• どんどん使ってください!

Mais conteúdo relacionado

Mais procurados

古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!
Naoto Ishizawa
 
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
Toshiaki Maki
 
Herokumeetup8 growライトニングトーク
Herokumeetup8 growライトニングトークHerokumeetup8 growライトニングトーク
Herokumeetup8 growライトニングトーク
淳 竹野
 

Mais procurados (20)

俺とGitHubとcodeシリーズ
俺とGitHubとcodeシリーズ俺とGitHubとcodeシリーズ
俺とGitHubとcodeシリーズ
 
俺とGitHub
俺とGitHub俺とGitHub
俺とGitHub
 
俺とGitHub(先行公開ver.)
俺とGitHub(先行公開ver.)俺とGitHub(先行公開ver.)
俺とGitHub(先行公開ver.)
 
ソース管理しようぜ!Gitの部
ソース管理しようぜ!Gitの部ソース管理しようぜ!Gitの部
ソース管理しようぜ!Gitの部
 
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
 
Roslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuoka
 
3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた
 
俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病
俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病
俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病
 
俺とホットキー
俺とホットキー俺とホットキー
俺とホットキー
 
TypeScript 独習会
TypeScript 独習会TypeScript 独習会
TypeScript 独習会
 
ChatOps with Hubot
ChatOps with HubotChatOps with Hubot
ChatOps with Hubot
 
mrubyで作るマイコンボード
mrubyで作るマイコンボードmrubyで作るマイコンボード
mrubyで作るマイコンボード
 
jQuery 対応ライブラリと TypeScript
jQuery 対応ライブラリと TypeScriptjQuery 対応ライブラリと TypeScript
jQuery 対応ライブラリと TypeScript
 
TypeScriptは明日から使うべき
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべき
 
C#への招待
C#への招待C#への招待
C#への招待
 
古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!
 
TypeScript 1.0 Released!
TypeScript 1.0 Released!TypeScript 1.0 Released!
TypeScript 1.0 Released!
 
俺と前回敗因から分析するバッドパターン
俺と前回敗因から分析するバッドパターン俺と前回敗因から分析するバッドパターン
俺と前回敗因から分析するバッドパターン
 
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
 
Herokumeetup8 growライトニングトーク
Herokumeetup8 growライトニングトークHerokumeetup8 growライトニングトーク
Herokumeetup8 growライトニングトーク
 

Destaque

C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi
 
Boost勉強会 #10 ディスカッションまとめ
Boost勉強会 #10 ディスカッションまとめBoost勉強会 #10 ディスカッションまとめ
Boost勉強会 #10 ディスカッションまとめ
Sigureya
 
3D CADと3Dプリンタ体験セミナー #1
3D CADと3Dプリンタ体験セミナー #13D CADと3Dプリンタ体験セミナー #1
3D CADと3Dプリンタ体験セミナー #1
Kou Ouchi
 

Destaque (20)

C++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
 
Boost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 merge
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
 
左と右の話
左と右の話左と右の話
左と右の話
 
Boost.Graph入門
Boost.Graph入門Boost.Graph入門
Boost.Graph入門
 
CG基礎3 メタリンク
CG基礎3 メタリンクCG基礎3 メタリンク
CG基礎3 メタリンク
 
Boost study meeting opening 4
Boost study meeting opening 4Boost study meeting opening 4
Boost study meeting opening 4
 
ABC2015 Summer LT
ABC2015 Summer LTABC2015 Summer LT
ABC2015 Summer LT
 
boost - std - C#
boost - std - C#boost - std - C#
boost - std - C#
 
boost::shared_ptr tutorial
boost::shared_ptr tutorialboost::shared_ptr tutorial
boost::shared_ptr tutorial
 
The Earth is not flat; but it's not round either (Geography on Boost.Geometry)
The Earth is not flat; but it's not round either (Geography on Boost.Geometry)The Earth is not flat; but it's not round either (Geography on Boost.Geometry)
The Earth is not flat; but it's not round either (Geography on Boost.Geometry)
 
Boost勉強会 #10 ディスカッションまとめ
Boost勉強会 #10 ディスカッションまとめBoost勉強会 #10 ディスカッションまとめ
Boost勉強会 #10 ディスカッションまとめ
 
Glfw3,OpenGL,GUI
Glfw3,OpenGL,GUI Glfw3,OpenGL,GUI
Glfw3,OpenGL,GUI
 
boost and c++11
boost and c++11boost and c++11
boost and c++11
 
ゲーム開発経営ゲーム
ゲーム開発経営ゲームゲーム開発経営ゲーム
ゲーム開発経営ゲーム
 
3DCAD@VDI活用とCADデータ管理のロードマップ
3DCAD@VDI活用とCADデータ管理のロードマップ3DCAD@VDI活用とCADデータ管理のロードマップ
3DCAD@VDI活用とCADデータ管理のロードマップ
 
error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
3D CADと3Dプリンタ体験セミナー #1
3D CADと3Dプリンタ体験セミナー #13D CADと3Dプリンタ体験セミナー #1
3D CADと3Dプリンタ体験セミナー #1
 
Unity MeshとColliderについて
Unity MeshとColliderについてUnity MeshとColliderについて
Unity MeshとColliderについて
 

Semelhante a Boost container feature

Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)
kotoji
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 

Semelhante a Boost container feature (20)

C++ Now 2012 report
C++ Now 2012 reportC++ Now 2012 report
C++ Now 2012 report
 
Cppmix 01
Cppmix 01Cppmix 01
Cppmix 01
 
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
 
dwangocpp1-lt
dwangocpp1-ltdwangocpp1-lt
dwangocpp1-lt
 
Tensor flow勉強会3
Tensor flow勉強会3Tensor flow勉強会3
Tensor flow勉強会3
 
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしようC++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
 
Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)
 
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
 
Scala lang evolution
Scala lang evolutionScala lang evolution
Scala lang evolution
 
C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話
 
The History of LINQ
The History of LINQThe History of LINQ
The History of LINQ
 
Boost17 cpplinq
Boost17 cpplinqBoost17 cpplinq
Boost17 cpplinq
 
oFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer WorkoutoFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer Workout
 
Mishimasyk6 iwatobipen
Mishimasyk6 iwatobipenMishimasyk6 iwatobipen
Mishimasyk6 iwatobipen
 
初音玲の流儀 - なんでプログラミングしているの?
初音玲の流儀 - なんでプログラミングしているの?初音玲の流儀 - なんでプログラミングしているの?
初音玲の流儀 - なんでプログラミングしているの?
 
cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)
 
今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築
 
Output Driven 20170721
Output Driven 20170721Output Driven 20170721
Output Driven 20170721
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
Boost Overview
Boost OverviewBoost Overview
Boost Overview
 

Mais de Akira Takahashi

Executors and schedulers
Executors and schedulersExecutors and schedulers
Executors and schedulers
Akira Takahashi
 
C++14 variable templates
C++14 variable templatesC++14 variable templates
C++14 variable templates
Akira Takahashi
 
C++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexprC++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexpr
Akira Takahashi
 
Leaning random using Boost Random
Leaning random using Boost RandomLeaning random using Boost Random
Leaning random using Boost Random
Akira Takahashi
 

Mais de Akira Takahashi (20)

Cpp20 overview language features
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
 
Cppmix 02
Cppmix 02Cppmix 02
Cppmix 02
 
Modern C++ Learning
Modern C++ LearningModern C++ Learning
Modern C++ Learning
 
cpprefjp documentation
cpprefjp documentationcpprefjp documentation
cpprefjp documentation
 
C++1z draft
C++1z draftC++1z draft
C++1z draft
 
Boost tour 1_61_0 merge
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 merge
 
Boost tour 1_61_0
Boost tour 1_61_0Boost tour 1_61_0
Boost tour 1_61_0
 
Boost tour 1.60.0 merge
Boost tour 1.60.0 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost Tour 1_58_0
Boost Tour 1_58_0Boost Tour 1_58_0
Boost Tour 1_58_0
 
C++14 enum hash
C++14 enum hashC++14 enum hash
C++14 enum hash
 
Programmer mind
Programmer mindProgrammer mind
Programmer mind
 
Boost.Study 14 Opening
Boost.Study 14 OpeningBoost.Study 14 Opening
Boost.Study 14 Opening
 
Executors and schedulers
Executors and schedulersExecutors and schedulers
Executors and schedulers
 
Improvement future api
Improvement future apiImprovement future api
Improvement future api
 
C++14 variable templates
C++14 variable templatesC++14 variable templates
C++14 variable templates
 
C++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexprC++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexpr
 
C++14 binary literals
C++14 binary literalsC++14 binary literals
C++14 binary literals
 
Leaning random using Boost Random
Leaning random using Boost RandomLeaning random using Boost Random
Leaning random using Boost Random
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
Boost Tour 1.53.0
Boost Tour 1.53.0Boost Tour 1.53.0
Boost Tour 1.53.0
 

Boost container feature