Boost container feature

Akira Takahashi
Akira TakahashiProgrammer en Preferred Networks, Inc.
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はよく使いますし、

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

Recomendados

Development C++ Community por
Development C++ CommunityDevelopment C++ Community
Development C++ CommunityAkira Takahashi
5.9K vistas49 diapositivas
Study3 boost por
Study3 boostStudy3 boost
Study3 boostKohsuke Yuasa
1.7K vistas45 diapositivas
Multi paradigm design por
Multi paradigm designMulti paradigm design
Multi paradigm designAkira Takahashi
3.2K vistas26 diapositivas
Start Concurrent por
Start ConcurrentStart Concurrent
Start ConcurrentAkira Takahashi
22.8K vistas19 diapositivas
俺とコミュニティ活動のタスク por
俺とコミュニティ活動のタスク俺とコミュニティ活動のタスク
俺とコミュニティ活動のタスクMasayuki KaToH
787 vistas19 diapositivas
2014 08-30 life with roslyn por
2014 08-30 life with roslyn2014 08-30 life with roslyn
2014 08-30 life with roslynshibuki
8.4K vistas26 diapositivas

Más contenido relacionado

La actualidad más candente

俺とGitHubとcodeシリーズ por
俺とGitHubとcodeシリーズ俺とGitHubとcodeシリーズ
俺とGitHubとcodeシリーズMasayuki KaToH
482 vistas53 diapositivas
俺とGitHub por
俺とGitHub俺とGitHub
俺とGitHubMasayuki KaToH
705 vistas92 diapositivas
俺とGitHub(先行公開ver.) por
俺とGitHub(先行公開ver.)俺とGitHub(先行公開ver.)
俺とGitHub(先行公開ver.)Masayuki KaToH
263 vistas12 diapositivas
ソース管理しようぜ!Gitの部 por
ソース管理しようぜ!Gitの部ソース管理しようぜ!Gitの部
ソース管理しようぜ!Gitの部pmw1415
358 vistas13 diapositivas
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部 por
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部Masahiro Wakame
12.8K vistas56 diapositivas
Roslynで体験してみるC#スクリプト #cs_fukuoka por
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuokaYuta Matsumura
2.1K vistas25 diapositivas

La actualidad más candente(20)

俺とGitHubとcodeシリーズ por Masayuki KaToH
俺とGitHubとcodeシリーズ俺とGitHubとcodeシリーズ
俺とGitHubとcodeシリーズ
Masayuki KaToH482 vistas
俺とGitHub(先行公開ver.) por Masayuki KaToH
俺とGitHub(先行公開ver.)俺とGitHub(先行公開ver.)
俺とGitHub(先行公開ver.)
Masayuki KaToH263 vistas
ソース管理しようぜ!Gitの部 por pmw1415
ソース管理しようぜ!Gitの部ソース管理しようぜ!Gitの部
ソース管理しようぜ!Gitの部
pmw1415358 vistas
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部 por Masahiro Wakame
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
TypeScript 型定義ファイルのある開発 TypeScript勉強会 VSハッカソン倶楽部
Masahiro Wakame12.8K vistas
Roslynで体験してみるC#スクリプト #cs_fukuoka por Yuta Matsumura
Roslynで体験してみるC#スクリプト #cs_fukuokaRoslynで体験してみるC#スクリプト #cs_fukuoka
Roslynで体験してみるC#スクリプト #cs_fukuoka
Yuta Matsumura2.1K vistas
3日時間をもらったのでTypeScriptを触ってみた por Yasushi Kato
3日時間をもらったのでTypeScriptを触ってみた3日時間をもらったのでTypeScriptを触ってみた
3日時間をもらったのでTypeScriptを触ってみた
Yasushi Kato28K vistas
俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病 por Masayuki KaToH
俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病
俺とPrivate Forkと炭の選び方とC++からRubyへのブレイクスルーとポモドーロテクニックとコミュニティ貢献と浪人アカウントと糖尿病
Masayuki KaToH382 vistas
mrubyで作るマイコンボード por kishima7
mrubyで作るマイコンボードmrubyで作るマイコンボード
mrubyで作るマイコンボード
kishima7361 vistas
TypeScriptは明日から使うべき por Masahiro Wakame
TypeScriptは明日から使うべきTypeScriptは明日から使うべき
TypeScriptは明日から使うべき
Masahiro Wakame6.1K vistas
古い?ダサい?まだまだイケルChef! por Naoto Ishizawa
古い?ダサい?まだまだイケルChef!古い?ダサい?まだまだイケルChef!
古い?ダサい?まだまだイケルChef!
Naoto Ishizawa792 vistas
TypeScript 1.0 Released! por Horuchi Hiroki
TypeScript 1.0 Released!TypeScript 1.0 Released!
TypeScript 1.0 Released!
Horuchi Hiroki1.1K vistas
俺と前回敗因から分析するバッドパターン por Masayuki KaToH
俺と前回敗因から分析するバッドパターン俺と前回敗因から分析するバッドパターン
俺と前回敗因から分析するバッドパターン
Masayuki KaToH500 vistas
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも! por Toshiaki Maki
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
ShibuyalispTT#4 LT 他言語で作ったWEBページをLispでも!
Toshiaki Maki1.2K vistas
Herokumeetup8 growライトニングトーク por 淳 竹野
Herokumeetup8 growライトニングトークHerokumeetup8 growライトニングトーク
Herokumeetup8 growライトニングトーク
淳 竹野2.2K vistas

Destacado

C++14 solve explicit_default_constructor por
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructorAkira Takahashi
7.3K vistas7 diapositivas
Boost Tour 1_58_0 merge por
Boost Tour 1_58_0 mergeBoost Tour 1_58_0 merge
Boost Tour 1_58_0 mergeAkira Takahashi
4.8K vistas114 diapositivas
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ por
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロdigitalghost
7.5K vistas21 diapositivas
左と右の話 por
左と右の話左と右の話
左と右の話Cryolite
6.9K vistas34 diapositivas
Boost.Graph入門 por
Boost.Graph入門Boost.Graph入門
Boost.Graph入門egtra
4K vistas23 diapositivas
CG基礎3 メタリンク por
CG基礎3 メタリンクCG基礎3 メタリンク
CG基礎3 メタリンクTetsuro Nakamura
630 vistas4 diapositivas

Destacado(20)

C++14 solve explicit_default_constructor por Akira Takahashi
C++14 solve explicit_default_constructorC++14 solve explicit_default_constructor
C++14 solve explicit_default_constructor
Akira Takahashi7.3K vistas
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ por digitalghost
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost7.5K vistas
左と右の話 por Cryolite
左と右の話左と右の話
左と右の話
Cryolite6.9K vistas
Boost.Graph入門 por egtra
Boost.Graph入門Boost.Graph入門
Boost.Graph入門
egtra4K vistas
boost::shared_ptr tutorial por NU_Pan
boost::shared_ptr tutorialboost::shared_ptr tutorial
boost::shared_ptr tutorial
NU_Pan2.9K vistas
The Earth is not flat; but it's not round either (Geography on Boost.Geometry) por Vissarion Fisikopoulos
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 ディスカッションまとめ por Sigureya
Boost勉強会 #10 ディスカッションまとめBoost勉強会 #10 ディスカッションまとめ
Boost勉強会 #10 ディスカッションまとめ
Sigureya1K vistas
Glfw3,OpenGL,GUI por hira_kuni_45
Glfw3,OpenGL,GUI Glfw3,OpenGL,GUI
Glfw3,OpenGL,GUI
hira_kuni_453.1K vistas
ゲーム開発経営ゲーム por Yuki Miyatake
ゲーム開発経営ゲームゲーム開発経営ゲーム
ゲーム開発経営ゲーム
Yuki Miyatake1.8K vistas
3DCAD@VDI活用とCADデータ管理のロードマップ por Dell TechCenter Japan
3DCAD@VDI活用とCADデータ管理のロードマップ3DCAD@VDI活用とCADデータ管理のロードマップ
3DCAD@VDI活用とCADデータ管理のロードマップ
Dell TechCenter Japan4.7K vistas
3D CADと3Dプリンタ体験セミナー #1 por Kou Ouchi
3D CADと3Dプリンタ体験セミナー #13D CADと3Dプリンタ体験セミナー #1
3D CADと3Dプリンタ体験セミナー #1
Kou Ouchi2.6K vistas
Unity MeshとColliderについて por Self Norl
Unity MeshとColliderについてUnity MeshとColliderについて
Unity MeshとColliderについて
Self Norl6.7K vistas

Similar a Boost container feature

C++ Now 2012 report por
C++ Now 2012 reportC++ Now 2012 report
C++ Now 2012 reportAkira Takahashi
1.1K vistas29 diapositivas
Cppmix 01 por
Cppmix 01Cppmix 01
Cppmix 01Akira Takahashi
1K vistas11 diapositivas
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた por
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたjohgus johgus
23 vistas35 diapositivas
dwangocpp1-lt por
dwangocpp1-ltdwangocpp1-lt
dwangocpp1-ltkarupanerura
1.7K vistas20 diapositivas
Tensor flow勉強会3 por
Tensor flow勉強会3Tensor flow勉強会3
Tensor flow勉強会3tak9029
4.4K vistas24 diapositivas
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう por
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしようC++CLIで、ネイティブCの保守開発に.NETを使って楽をしよう
C++CLIで、ネイティブCの保守開発に.NETを使って楽をしようStudy Group by SciencePark Corp.
194 vistas12 diapositivas

Similar a Boost container feature(20)

PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた por johgus johgus
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみたPHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
PHPからC#のライブラリを呼べるようにしたdotnet_ffiを趣味でつくってみた
johgus johgus23 vistas
Tensor flow勉強会3 por tak9029
Tensor flow勉強会3Tensor flow勉強会3
Tensor flow勉強会3
tak90294.4K vistas
Tickライブラリで遊ぼう(C++) por kotoji
Tickライブラリで遊ぼう(C++)Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)
kotoji2.2K vistas
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能 por Yoshifumi Kawai
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
ライブラリ作成のすゝめ - 事例から見る個人OSS開発の効能
Yoshifumi Kawai42.8K vistas
C++でCプリプロセッサを作ったり速くしたりしたお話 por Kinuko Yasuda
C++でCプリプロセッサを作ったり速くしたりしたお話C++でCプリプロセッサを作ったり速くしたりしたお話
C++でCプリプロセッサを作ったり速くしたりしたお話
Kinuko Yasuda33.5K vistas
oFの話題が殆ど出ない oF jp Summer Workout por Tsuubito Ishii
oFの話題が殆ど出ない oF jp Summer WorkoutoFの話題が殆ど出ない oF jp Summer Workout
oFの話題が殆ど出ない oF jp Summer Workout
Tsuubito Ishii1.2K vistas
初音玲の流儀 - なんでプログラミングしているの? por Akira Hatsune
初音玲の流儀 - なんでプログラミングしているの?初音玲の流儀 - なんでプログラミングしているの?
初音玲の流儀 - なんでプログラミングしているの?
Akira Hatsune3.3K vistas
cbt (Cranberries Build Tool) por Wada Yuki
cbt (Cranberries Build Tool)cbt (Cranberries Build Tool)
cbt (Cranberries Build Tool)
Wada Yuki135 vistas
今時のオンプレなgithubクローン環境構築 por You&I
今時のオンプレなgithubクローン環境構築今時のオンプレなgithubクローン環境構築
今時のオンプレなgithubクローン環境構築
You&I197 vistas
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ por Genya Murakami
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami52.4K vistas

Más de Akira Takahashi

Cpp20 overview language features por
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language featuresAkira Takahashi
890 vistas28 diapositivas
Cppmix 02 por
Cppmix 02Cppmix 02
Cppmix 02Akira Takahashi
675 vistas7 diapositivas
Modern C++ Learning por
Modern C++ LearningModern C++ Learning
Modern C++ LearningAkira Takahashi
18.5K vistas12 diapositivas
cpprefjp documentation por
cpprefjp documentationcpprefjp documentation
cpprefjp documentationAkira Takahashi
1.3K vistas23 diapositivas
C++1z draft por
C++1z draftC++1z draft
C++1z draftAkira Takahashi
6.6K vistas67 diapositivas
Boost tour 1_61_0 merge por
Boost tour 1_61_0 mergeBoost tour 1_61_0 merge
Boost tour 1_61_0 mergeAkira Takahashi
2K vistas126 diapositivas

Más de Akira Takahashi(20)

Cpp20 overview language features por Akira Takahashi
Cpp20 overview language featuresCpp20 overview language features
Cpp20 overview language features
Akira Takahashi890 vistas
C++14 relaxing constraints on constexpr por Akira Takahashi
C++14 relaxing constraints on constexprC++14 relaxing constraints on constexpr
C++14 relaxing constraints on constexpr
Akira Takahashi4.7K vistas
Leaning random using Boost Random por Akira Takahashi
Leaning random using Boost RandomLeaning random using Boost Random
Leaning random using Boost Random
Akira Takahashi6.2K vistas

Boost container feature