Submit Search
Upload
クソザコ鳥頭が非順序連想コンテナに入門してみた
•
Download as PPTX, PDF
•
7 likes
•
6,874 views
M
Mitsuru Kariya
Follow
Boost.勉強会 #19 東京 自主クソザコ枠
Read less
Read more
Technology
Report
Share
Report
Share
1 of 106
Download now
Recommended
すごいConstたのしく使おう!
すごいConstたのしく使おう!
Akihiro Nishimura
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
線形代数の視覚的理解 V1.1-Gストラング勉強会
線形代数の視覚的理解 V1.1-Gストラング勉強会
Kenji Hiranabe
Recommended
すごいConstたのしく使おう!
すごいConstたのしく使おう!
Akihiro Nishimura
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
digitalghost
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
線形代数の視覚的理解 V1.1-Gストラング勉強会
線形代数の視覚的理解 V1.1-Gストラング勉強会
Kenji Hiranabe
多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化
Norishige Fukushima
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
async/await のしくみ
async/await のしくみ
信之 岩永
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
圏論は、随伴が全て
圏論は、随伴が全て
ohmori
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
Shigenori Sagawa
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
C++の黒魔術
C++の黒魔術
Daichi OBINATA
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
UnityTechnologiesJapan002
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
error handling using expected
error handling using expected
Akira Takahashi
女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++
cocodrips
More Related Content
What's hot
多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化
Norishige Fukushima
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
async/await のしくみ
async/await のしくみ
信之 岩永
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
圏論は、随伴が全て
圏論は、随伴が全て
ohmori
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
Shigenori Sagawa
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Hiro H.
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
C++の黒魔術
C++の黒魔術
Daichi OBINATA
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
Takaaki Suzuki
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
UnityTechnologiesJapan002
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
TetsuroMatsumura
闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Unity Technologies Japan K.K.
What's hot
(20)
多チャンネルバイラテラルフィルタの高速化
多チャンネルバイラテラルフィルタの高速化
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
async/await のしくみ
async/await のしくみ
中3女子でもわかる constexpr
中3女子でもわかる constexpr
クロージャデザインパターン
クロージャデザインパターン
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
圏論は、随伴が全て
圏論は、随伴が全て
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
Pythonによる黒魔術入門
Pythonによる黒魔術入門
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
C++の黒魔術
C++の黒魔術
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C#×LLVM=アセンブラ!? 〜詳説・Burstコンパイラー〜
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
C++20 モジュールの概要 / Introduction to C++ modules (part 1)
闇魔術を触ってみた
闇魔術を触ってみた
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
Viewers also liked
error handling using expected
error handling using expected
Akira Takahashi
女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++
cocodrips
SDL2の紹介
SDL2の紹介
nyaocat
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Akira Takahashi
Boost tour 1.60.0
Boost tour 1.60.0
Akira Takahashi
左と右の話
左と右の話
Cryolite
よくわかるHopscotch hashing
よくわかるHopscotch hashing
Kumazaki Hiroki
Boost container feature
Boost container feature
Akira Takahashi
emcjp Item 42
emcjp Item 42
MITSUNARI Shigeo
Emcjp item21
Emcjp item21
MITSUNARI Shigeo
Multi paradigm design
Multi paradigm design
Akira Takahashi
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
Ryo Igarashi
Gitのよく使うコマンド
Gitのよく使うコマンド
YUKI Kaoru
バージョン管理のワークフロー
バージョン管理のワークフロー
add20
南極マラソン報告会 半原小学校スライド
南極マラソン報告会 半原小学校スライド
AKASAKA_TAKESHI
Entrepreneurial lessons apr2012
Entrepreneurial lessons apr2012
Sam Beal
Google analytics常用指标及解读
Google analytics常用指标及解读
askcliff
3 d pie chart circular puzzle with hole in center pieces 7 stages style 4 pow...
3 d pie chart circular puzzle with hole in center pieces 7 stages style 4 pow...
SlideTeam.net
Technology inventory
Technology inventory
Pinhsuan
Viewers also liked
(20)
error handling using expected
error handling using expected
女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++
SDL2の紹介
SDL2の紹介
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost tour 1.60.0 merge
Boost tour 1.60.0 merge
Boost tour 1.60.0
Boost tour 1.60.0
左と右の話
左と右の話
よくわかるHopscotch hashing
よくわかるHopscotch hashing
Boost container feature
Boost container feature
emcjp Item 42
emcjp Item 42
Emcjp item21
Emcjp item21
Multi paradigm design
Multi paradigm design
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
Gitのよく使うコマンド
Gitのよく使うコマンド
バージョン管理のワークフロー
バージョン管理のワークフロー
南極マラソン報告会 半原小学校スライド
南極マラソン報告会 半原小学校スライド
Entrepreneurial lessons apr2012
Entrepreneurial lessons apr2012
Google analytics常用指标及解读
Google analytics常用指标及解读
3 d pie chart circular puzzle with hole in center pieces 7 stages style 4 pow...
3 d pie chart circular puzzle with hole in center pieces 7 stages style 4 pow...
Technology inventory
Technology inventory
Similar to クソザコ鳥頭が非順序連想コンテナに入門してみた
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
信之 岩永
最近の単体テスト
最近の単体テスト
Ken Morishita
Yarudake
Yarudake
Ken Ogura
C++でぼくが忘れがちなこと
C++でぼくが忘れがちなこと
Toshihiko Ando
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
Chihiro Fukazawa
資料
資料
Bob_Mk2
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
shoma h
C#言語機能の作り方
C#言語機能の作り方
信之 岩永
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
Yoshitaka Kimisaki
Unit Test
Unit Test
ykhr
Rpn and forth 超入門
Rpn and forth 超入門
Yoshitaka Seo
Ph per のための php 最適
Ph per のための php 最適
Soudai Sone
デザイナーのためのPHP講座 for WordPress (初級)
デザイナーのためのPHP講座 for WordPress (初級)
佑 小田垣佑
とあるFlashの自動生成
とあるFlashの自動生成
Akineko Shimizu
Webページで学ぶJavaScript2013 第1回
Webページで学ぶJavaScript2013 第1回
京大 マイコンクラブ
再帰、漸化式、差分方程式とアルゴリズム Gx#20
再帰、漸化式、差分方程式とアルゴリズム Gx#20
鉄次 尾形
わんくま東京#38 LT 「Func<> と ref / out 小咄」
わんくま東京#38 LT 「Func<> と ref / out 小咄」
Takeshi Kiriya
Start!! Ruby
Start!! Ruby
mitim
Similar to クソザコ鳥頭が非順序連想コンテナに入門してみた
(20)
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
最近の単体テスト
最近の単体テスト
Yarudake
Yarudake
C++でぼくが忘れがちなこと
C++でぼくが忘れがちなこと
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
資料
資料
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
C#言語機能の作り方
C#言語機能の作り方
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
Unit Test
Unit Test
Rpn and forth 超入門
Rpn and forth 超入門
Ph per のための php 最適
Ph per のための php 最適
デザイナーのためのPHP講座 for WordPress (初級)
デザイナーのためのPHP講座 for WordPress (初級)
とあるFlashの自動生成
とあるFlashの自動生成
Webページで学ぶJavaScript2013 第1回
Webページで学ぶJavaScript2013 第1回
再帰、漸化式、差分方程式とアルゴリズム Gx#20
再帰、漸化式、差分方程式とアルゴリズム Gx#20
わんくま東京#38 LT 「Func<> と ref / out 小咄」
わんくま東京#38 LT 「Func<> と ref / out 小咄」
Start!! Ruby
Start!! Ruby
Recently uploaded
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NTT DATA Technology & Innovation
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
Recently uploaded
(9)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クソザコ鳥頭が非順序連想コンテナに入門してみた
1.
クソザコ鳥頭が 非順序連想コンテナに 入門してみた 2015/12/05 鳥頭かりやマン 1
2.
で、お前だれよ? 2
3.
で、お前だれよ? ■名前 ⇒刈谷 満(鳥頭かりやマン) ■職業 ⇒働かないタイプの社畜(老い先短い) ■普段使用してる言語 ⇒ ExcelHogan(好きとは言ってない) ■好きな言語 ⇒
C++、Perl5(できるとは言ってない) 3
4.
何でクソザコが 発表してんの? 4
5.
何でクソザコが発表してんの? ※ 意味 てめぇ、ありがたくも cpprefjp
編集させて やってるんだから Boost.勉強会で発表ぐ らいしろやゴルァ! せっかく cpprefjp で unordered やったんだから、 Boost.勉強会で発表でも どうですか?※ 5
6.
非順序連想コンテナ とは? 6
7.
非順序連想コンテナとは? • 今すぐ使用すべき 連想界のスーパーコンテナ • 速い(検索が) •
小さい(メモリ使用量が) • 長い(名前が) ※連想コンテナ比 ※ ※ ※ 7
8.
非順序連想コンテナって どんな構造? 8
9.
非順序連想コンテナって どんな構造? 非順序連想コンテナ鉄の掟 1. 非順序連想コンテナの要素は「bucket」に 分けて入れられる。 2. 同じハッシュコードのキーは同じ「bucket」 に現れる。 3.
要素が追加されると「bucket」の数は自動 で増えるので、「bucket」あたりの平均要 素数は限度以下に保たれる。 from C++規格書勝手訳 9
10.
bucket? バゲット? ©佐野研二郎 10
11.
bucket? bucket 【可算名詞】 バケツ; 手おけ; つるべ. from
研究社 新英和中辞典 11
12.
非順序連想コンテナって どんな構造? つまり… 12
13.
非順序連想コンテナって どんな構造? 非順序連想コンテナ鉄の掟 1. 非順序連想コンテナの要素はバケツに分 けて入れられる。 13
14.
非順序連想コンテナって どんな構造? バケツが何個かあって… bucket_count() = 3,
size() = 0 (empty()) 0 1 2 14
15.
非順序連想コンテナって どんな構造? 赤城さんを入渠追加する場合… ハッシュ関数でハッシュ値を計算して… ハッシュ値:55ハッシュ関数 (弾薬最大) insert(const value_type&) とか… 15
16.
非順序連想コンテナって どんな構造? ハッシュ値に従って選ばれた バケツに入れる! size() = 1 0
1 2 この場合、 ハッシュ値「55」を バケツ数「3」で割った 余り「1」に 16
17.
非順序連想コンテナって どんな構造? 非順序連想コンテナ鉄の掟 2. 同じハッシュコードのキーは同じバケツに 現れる。 17
18.
非順序連想コンテナって どんな構造? 雷電姉妹を追加する場合、 ハッシュ値は同じなので… (姉妹だからしょうがないね…) ハッシュ値:20ハッシュ関数 (弾薬最大) 雷と電で ハッシュ値が 「衝突」している 18
19.
非順序連想コンテナって どんな構造? 同じバケツに入れるのです! size() = 3 0
1 2 ハッシュ値「20」を バケツ数「3」で割った 余り「2」に 19
20.
非順序連想コンテナって どんな構造? ちなみに、バケツ要素数を得る bucket_size() ってのがあって 0 1
2 0 1 2 20
21.
非順序連想コンテナって どんな構造? バケツ内だけのイテレータも取れる 0 1 2 最初は begin(2),
cbegin(2) 最後は end(2), cend(2) 例によって最後の 要素の一つ先 でもぶっちゃけ 使い道が わからん… 21
22.
非順序連想コンテナって どんな構造? さらに島風を追加する場合… ハッシュ値:25ハッシュ関数 (弾薬最大) 22
23.
非順序連想コンテナって どんな構造? ハッシュ値は違うけど、同じバケツに なっちゃう… 0 1 2 この場合、 ハッシュ値「25」を バケツ数「3」で割った 余り「1」に 23
24.
非順序連想コンテナって どんな構造? ハッシュ値は違うけど、同じバケツに なっちゃう… 0 1 2 でも、 ちょっと混み過ぎ だよね… 24
25.
非順序連想コンテナって どんな構造? 非順序連想コンテナ鉄の掟 3. 要素が追加されるとバケツの数は自動で 増えるので、バケツあたりの平均要素数 は限度以下に保たれる。 load factor 「占有率」とか「負荷率」とか
25
26.
非順序連想コンテナって どんな構造? バケツあたりの平均要素数は、 要素数4/バケツ数3=1.3333… size() / bucket_count() これは
load_factor() で得られる。 0 1 2 26
27.
非順序連想コンテナって どんな構造? 上限も max_load_factor() で得られる。 デフォルトは1.0。 ⇒やっぱり混み過ぎなので… 0
1 2 27
28.
非順序連想コンテナって どんな構造? バケツが自動で増える!(リハッシュと言う) bucket_count() = 4 (普通はバケツ数もっと増えます…) 0
1 2 3 リハッシュで バケツが別れた リハッシュされたら バケツが分かれた 仲良しハッシュ値が 同じなのでリハッシュ されてもバケツが 一緒なのです! 28
29.
非順序連想コンテナって どんな構造? ちなみに… 29
30.
非順序連想コンテナって どんな構造? ↑ ↑ ↑
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ これ を こう するのは結構大変なので、あらかじめ バケツ数を増やしておくこともできる。 0 1 2 0 1 2 3 30
31.
非順序連想コンテナって どんな構造? n 個以上バケツを確保しておく。 rehash(n) リハッシュされずに n
個の要素が 格納できるだけのバケツを確保しておく。 reserve(n) 31
32.
非順序連想コンテナって どんな構造? n 個以上バケツを確保しておく。 rehash(n) リハッシュされずに n
個の要素が 格納できるだけのバケツを確保しておく。 reserve(n) が! 32
33.
非順序連想コンテナって どんな構造? ちょっと規格に問題があって、 reserve(n) だと n
個の要素が格納できない… (LWG Issue 2156) n を 1 つ増やしておくと良さそう… cpprefjp の unordered_*::reserve にも書いてあるので見てみてください… http://cpprefjp.github.io/reference/unordered_set/unordered_set/reserve.html 33
34.
非順序連想コンテナって どんな構造? あと、max_load_factor() も デフォルトの1.0 以外を指定できる! max_load_factor(float) でも、必ず指定した値になるとは限らないし、 特に要素格納してから設定するといろいろ トラブるもとになるから、気をつけよう! cpprefjp
の unordered_*::max_load_factor にも書いてあるので見てみてください… http://cpprefjp.github.io/reference/unordered_map/unordered_multimap/max_load_factor.html 34
35.
で、実際のところ 実装はどうなってんの? 35
36.
で、実際のところ 実装はどうなってんの? 実装を覗いてみました libstdc++ (GCC) libc++ (Clang) boost.unordered 36
37.
で、実際のところ 実装はどうなってんの? ハッシュテーブルのよく見るイメージ図 from CodeZine のJavaセキュアコーディング入門 バケツ配列 (ノードへの ポインタ配列) 同一バケツ内の 次の要素を指す ポインタ 各要素 (ノード) 37
38.
で、実際のところ 実装はどうなってんの? 実装見るまで私もそう思ってました… from CodeZine のJavaセキュアコーディング入門 同一バケツ内の 次の要素を指す ポインタ 各要素 (ノード) バケツ配列 (ノードへの ポインタ配列) 38
39.
で、実際のところ 実装はどうなってんの? 問題点1 イテレータで 前に進むときに困る iterator::operator()++ 39
40.
で、実際のところ 実装はどうなってんの? from CodeZine のJavaセキュアコーディング入門 イテレータが ココを指してる時は いいけど… 次! 40
41.
で、実際のところ 実装はどうなってんの? from CodeZine のJavaセキュアコーディング入門 イテレータが ココを指してる時は いいけど… イテレータが ココを指してる時、 次に進めない… 次? 41
42.
で、実際のところ 実装はどうなってんの? from CodeZine のJavaセキュアコーディング入門 イテレータが ココを指してる時は いいけど… イテレータが ココを指してる時、 次に進めない… そんなん バケツ配列の次たどって 行けばええやん? 42
43.
で、実際のところ 実装はどうなってんの? イテレータが ココを指してる時は いいけど… イテレータが ココを指してる時、 次に進めない… そんなん バケツ配列の次たどって 行けばええやん?ダメ!ゼッタイ! 43
44.
で、実際のところ 実装はどうなってんの? イテレータに対する 操作は定数時間で なければならない! (ホントは償却定数時間ならいいんだけど、さすがにこれじゃダメ…) 44
45.
で、実際のところ 実装はどうなってんの? じゃあこんな感じ? from CodeZine のJavaセキュアコーディング入門 各バケツの最後の 要素は次のバケツの 最初の要素を指す 45
46.
で、実際のところ 実装はどうなってんの? じゃあこんな感じ? from CodeZine のJavaセキュアコーディング入門 各バケツの最後の 要素は次のバケツの 最初の要素を指す libstdc++
4.6.x までは この時点でもうダメっぽい… 頼むよ GCC… 46
47.
で、実際のところ 実装はどうなってんの? 問題点2 追加したときに困る insert(const value_type&) とか 47
48.
で、実際のところ 実装はどうなってんの? 例えばこの状態で… from CodeZine のJavaセキュアコーディング入門 このバケツに 追加すると… 48
49.
で、実際のところ 実装はどうなってんの? 例えばこの状態で… from CodeZine のJavaセキュアコーディング入門 これを… こうしなきゃ ならない… このバケツに 追加すると… 49
50.
で、実際のところ 実装はどうなってんの? 例えばこの状態で… from CodeZine のJavaセキュアコーディング入門 これを… こうしなきゃ ならない… このバケツに 追加すると… そんなん バケツ配列の前(ry 50
51.
で、実際のところ 実装はどうなってんの? 例えばこの状態で… from CodeZine のJavaセキュアコーディング入門 これを… こうしなきゃ ならない… このバケツに 追加すると… そんなん バケツ配列の前(ryダメ!ゼッタイ! 51
52.
で、実際のところ 実装はどうなってんの? 1件 insert も 定数時間でなければ ならない! (これも償却定数時間ならいいんだけど、やっぱりダメ…) 52
53.
で、実際のところ 実装はどうなってんの? じゃあどうするの… from CodeZine のJavaセキュアコーディング入門 こいつを頭に つけちゃえば いい! つまり、 バケツ順に 並んでない… 53
54.
で、実際のところ 実装はどうなってんの? 問題点3 削除の時も困る erase(const key_type&) とか 54
55.
で、実際のところ 実装はどうなってんの? たとえば erase(const key_type&) from
CodeZine のJavaセキュアコーディング入門 ココをキー指定で 削除したいときは… キーから ハッシュ値を計算して ここからたどって… 55
56.
で、実際のところ 実装はどうなってんの? たとえば erase(const key_type&) from
CodeZine のJavaセキュアコーディング入門 一つ前のポインタを 修正しなきゃならないけど… 要素を削除して… どうやって 逆向きに たどるねん… 56
57.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列からは 一つ前の要素を指す 初っ端は 前が無いから ダミーを指す めっさ カオス… 57
58.
で、実際のところ 実装はどうなってんの? その他 イメージ図には 普通描かれないけど、 いろいろある 58
59.
で、実際のところ 実装はどうなってんの? バケツ配列だって アロケータで確保するだろJK ⇓ バケツ配列へのポインタが必要 59
60.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列 へのポインタ 60
61.
で、実際のところ 実装はどうなってんの? バケツって 今何個あるんだっけ? ⇓ バケツ数 bucket_count() 61
62.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列 へのポインタ バケツ数 62
63.
で、実際のところ 実装はどうなってんの? 要素数返すのに いちいち数えてたらヤバい (計算量的な意味で) ⇓ 要素数 size() 63
64.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列 へのポインタ バケツ数 要素数 64
65.
で、実際のところ 実装はどうなってんの? さっき出てきた max_load_factor() は? 65
66.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列 へのポインタ バケツ数 要素数 最大負荷率 66
67.
で、実際のところ 実装はどうなってんの? ハッシュ関数、キー比較関数、アロケータは どこ行った ⇓ ハッシュ関数、キー比較関数、アロケータ hash_function() key_eq() get_allocator() 67
68.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列 へのポインタ バケツ数 要素数 最大負荷率 ハッシュ関数 オブジェクト キー比較関数 オブジェクト アロケータ オブジェクト 実際のところ、これら3つは 大抵状態を持たないので、 空基底最適化によって サイズを0にしている実装もある (EBO:Empty
Base Optimization) 68
69.
で、実際のところ 実装はどうなってんの? こんな感じ? from CodeZine のJavaセキュアコーディング入門 ダミー バケツ配列 へのポインタ バケツ数 要素数 最大負荷率 ハッシュ関数 オブジェクト キー比較関数 オブジェクト アロケータ オブジェクト ちなみに、 このへんの左側の箱が 非順序連想コンテナの オブジェクト本体になる (あとはアロケータで確保) 69
70.
で、実際のところ 実装はどうなってんの? ちょっと 正しく理解出来てるか 自信が無かったので、 オブジェクトのサイズを 実際に見てみた 70
71.
で、実際のところ 実装はどうなってんの? 対象 libc++ 3.0~3.8(Clang) libstdc++ 4.6.4~6.0.0(GCC) boost.unordered
1.47~1.59 いずれも、long とポインタが64bitのケース (LP64モデル) 71
72.
で、実際のところ 実装はどうなってんの? 調べ方 基本、sizeof(unordered_set<int>)を見てみる。 加えて、各関数オブジェクトに 64bit(8バイト) の状態を持たせたケースも見てみる。 72
73.
で、実際のところ 実装はどうなってんの? 基本 ハッシュや キー比較に 8バイト アロケータに 8バイト 全部に 8バイト (計24バイト) libc++ 3.0~3.8
40 48(+8) 56(+16) 72(+32) libstdc++ 4.6.4 56 72(+16) 64(+8) 88(+32) libstdc++ 4.7.0~4.7.4 64 72(+8) 64(+0) 80(+16) libstdc++ 4.8.0~4.9.0 48 56(+8) 56(+8) 72(+24) libstdc++ 4.9.1~6.0 56 64(+8) 64(+8) 80(+24) boost 1.47 56 80(+24) 72(+16) 104(+48) boost 1.48~1.51 40 72(+32) 56(+16) 96(+48) boost 1.52~1.59 48 72(+24) 64(+16) 96(+40) 結果、こうなりました。 73
74.
で、実際のところ 実装はどうなってんの? 基本 ハッシュや キー比較に 8バイト アロケータに 8バイト 全部に 8バイト (計24バイト) libc++ 3.0~3.8
40 48(+8) 56(+16) 72(+32) libc++ 3.0~3.8 EBOも効いててだいたい順当。 ただし、アロケータは、バケツ配列用と ノード用の2つ持ってる。 (両方はいらないと思うんだけど…) 74
75.
で、実際のところ 実装はどうなってんの? libc++ 3.0~3.8 こんな イメージ です (カッコ内はバイト数) バケツ配列へのポインタ(8) バケツ配列用アロケータ(0, 8) バケツ数(8) ノード用アロケータ(0,
8) ダミーノード(8) ハッシュ関数オブジェクト(0, 8) 要素数(8) キー比較関数オブジェクト(0, 8) 最大負荷率(4) ココでEBO ココでEBO ココでEBO ココでEBO 75
76.
で、実際のところ 実装はどうなってんの? 基本 ハッシュや キー比較に 8バイト アロケータに 8バイト 全部に 8バイト (計24バイト) libstdc++ 4.9.1~6.0
56 64(+8) 64(+8) 80(+24) libstdc++ 4.9.1~6.0 EBOは効いてるけど、基本がデカい。 1. floatの計算を極力避けるため、次にリ ハッシュが起きる要素数を持ってる。 2. バケツ数が0になるのを避けるため、要素 数1のバケツ配列を持ってる。 76
77.
で、実際のところ 実装はどうなってんの? libstdc++ 4.9.1~6.0 こんな イメージ です (カッコ内はバイト数) ハッシュ関数オブジェクト(0, 8) キー比較関数オブジェクト(0,
8) アロケータオブジェクト(0, 8) バケツ配列へのポインタ(8) バケツ数(8) ダミーノード(8) 要素数(8) 最大負荷率(4) 次にリハッシュされる要素数(8) 1要素のバケツ配列(8) ココと 自クラスと でEBO 77
78.
で、実際のところ 実装はどうなってんの? ちなみに、libstdc++ 4.8.0~4.8.5 は、 状態を持つハッシュ関数オブジェクト 使うとコンパイルエラーが出ました。 (static_assertで失敗) 普通はあんまり そんなことしないと 思うけど… 78
79.
で、実際のところ 実装はどうなってんの? 基本 ハッシュや キー比較に 8バイト アロケータに 8バイト 全部に 8バイト (計24バイト) boost 1.52~1.59
48 72(+24) 64(+16) 96(+40) boost.unordered 各関数オブジェクトがデカい。 1. ハッシュとキー比較を2セットと、使ってる側フラ グを持ってる。(強い例外保証のためらしい…) 2. アロケータも、バケツ配列用とノード用の2つ 持ってる。(両方は(ry) 3. 次にリハッシュが起きる要素数を持ってる。 79
80.
で、実際のところ 実装はどうなってんの? boost 1.52~1.59 こんな イメージ です (カッコ内はバイト数) どっちの関数使ってるフラグ(1) ハッシュ関数1(0, 8)、キー比較関数1(0,
8) ハッシュ関数2(0, 8)、キー比較関数2(0, 8) バケツ配列用アロケータ(0, 8) ノード用アロケータ(0, 8) バケツ数(8) 要素数(8) 最大負荷率(4) 次にリハッシュされる要素数(8) バケツ配列へのポインタ(8) ココでEBO ココでEBO ココでEBO それぞれは 両方0でも 0にはならない あれ? ダミーノード が無い… 80
81.
で、実際のところ 実装はどうなってんの? boost 1.52~1.59 こんな イメージ です (カッコ内はバイト数) どっちの関数使ってるフラグ(1) ハッシュ関数1(0, 8)、キー比較関数1(0,
8) ハッシュ関数2(0, 8)、キー比較関数2(0, 8) バケツ配列用アロケータ(0, 8) ノード用アロケータ(0, 8) バケツ数(8) 要素数(8) 最大負荷率(4) 次にリハッシュされる要素数(8) バケツ配列へのポインタ(8) ココでEBO ココでEBO ココでEBO それぞれは 両方0でも 0にはならない あれ? ダミーノード が無い… バケツ配列の 最後の要素を ダミーノードとして 使ってるっぽい… 81
82.
で、実際のところ 実装はどうなってんの? ついでに ノードのサイズも見てみた (アロケータで割り当てサイズを出力した) 82
83.
で、実際のところ 実装はどうなってんの? ノードサイズ libc++ 3.0~3.8 24 libstdc++
4.6.4~6.0 16 boost 1.47 16 boost 1.48~1.59 24 結果、こうなりました。 あれ? 要素(int)と ポインタと… あと何? ハッシュ値 でした… 83
84.
で、実際のところ 実装はどうなってんの? つまり、 1. libc++ と
boost 1.48以降はハッシュ値は 一度計算するとノードに保存しとく。 2. libstdc++ と boost 1.47 は毎回計算する。 と、思ったら、libstdc++ 4.8.0 以降については、 マニュアルに記載がありました! 84
85.
で、実際のところ 実装はどうなってんの? libstdc++ 4.8.0 以降では、以下のいずれか が満たされれば、ハッシュ値がノードに保存 される。 1.
ハッシュ関数の operator() が noexcept じゃない。 2. std::__is_fast_hash<hasher> が std::false_type を 継承している。 (デフォルトは std::true_typeを継承) https://gcc.gnu.org/onlinedocs/gcc-4.8.0/libstdc++/manual/manual/unordered_associative.html 85
86.
で、実際のところ 実装はどうなってんの? ちなみに、GCC 4.6.x と
4.7.x については、 制御する方法は無いっぽい… もしあったら教えてください。 内部実装を直接使えば制御できるっぽいけど… 86
87.
中身はだいたい分かった。 で、使い方は? 87
88.
中身はだいたい分かった。 で、使い方は? 連想コンテナと だいたい同じです! (完) 88
89.
中身はだいたい分かった。 で、使い方は? 最大の違いはハッシュ! (あたりまえ) ハッシュ関数が悪いと めっさ性能が悪くなるので、 気をつけよう!(どうやって…) 89
90.
中身はだいたい分かった。 で、使い方は? 規格には自前のハッシュ関数 作るのを支援してくれる機構は (まだ?)無い… ⇓ 作るのムズいので、 Boost.Functional/Hash ですかね… 90
91.
中身はだいたい分かった。 で、使い方は? あと、連想コンテナには無い メンバ関数もいくつかあるけど、 (バケツ系とか)、 あんまり使う気がしない… せいぜい、rehash と reserve
ですかね… (最初の方で説明した奴) 91
92.
中身はだいたい分かった。 で、使い方は? 連想コンテナ • 双方向イテレータ • 昇順にならんでる •
変更操作でイテ レータが無効にな らない 非順序連想コンテナ • 前方向イテレータ • 順序って何? • 変更操作でイテ レータが無効にな るかも(リハッシュ) イテレータにはこんな違いが… 92
93.
中身はだいたい分かった。 で、使い方は? あ! C++14 で連想コンテナに追加された、 異種混合比較※は、 非順序連想コンテナには 無いです!(残念!) ハッシュ値が必要だから仕方ないね… ※ string
がキーのコンテナを検索する時に、const char* 渡したりする奴 http://faithandbrave.hateblo.jp/entry/20131121/1385013127 93
94.
中身はだいたい分かった。 で、使い方は? 要素追加時にも ちょっとした違いが… insert(const_iterator it, ...); emplace_hint(const_iterator
it, ...); ⇓ it は意味なし! 94
95.
中身はだいたい分かった。 で、使い方は? 要素追加時にも ちょっとした違いが… insert(const_iterator it, ...); emplace_hint(const_iterator
it, ...); ⇓ it は意味なし! どっちにしろ、 ハッシュ値からたどる 必要があるので… 95
96.
中身はだいたい分かった。 で、使い方は? 最後に、 せっかく要素追加が出てきたので、 insert と emplace
の使い分けを。 (連想コンテナと一緒だけど…) 96
97.
中身はだいたい分かった。 で、使い方は? emplace すごいよね! コンテナ内に直接構築できるし! じゃあ下の例だったらどれ使う? 1. c[key]
= value; 2. c.insert(make_pair(key, value)); 3. c.emplace(key, value); 97
98.
中身はだいたい分かった。 で、使い方は? 1. c[key] =
value; ① keyが既にコンテナにある時は、 値が value で上書かれる。 ② key がまだコンテナに無い時は、 デフォルト値で新規ノード作っちゃう。 98
99.
中身はだいたい分かった。 で、使い方は? 1. c[key] =
value; ① keyが既にコンテナにある時は、 値が value で上書かれる。 ② key がまだコンテナに無い時は、 デフォルト値で新規ノード作っちゃう。 新規ノード作る時に、 まずデフォルトコンストラクタで value の型の要素を構築してから value を代入することになる ⇓ 型によっては効率悪い そんなん百も 承知ですよね… 99
100.
中身はだいたい分かった。 で、使い方は? 2. c.insert(make_pair(key, value)); ①
key が既にコンテナにある時は、 値は上書かれない。 ② key がまだコンテナに無い時だけ、 ノードが新規に作られる。 何を当たり前の ことを… 100
101.
中身はだいたい分かった。 で、使い方は? 3. c.emplace(key, value); ①
key が既にコンテナにある時は、 値は上書かれない。(insert と一緒) ② key の有無に関わらず、 ノードが新規に作られるかも… 101
102.
中身はだいたい分かった。 で、使い方は? 3. c.emplace(key, value); ①
key が既にコンテナにある時は、 値は上書かれない。(insert と一緒) ② key の有無に関わらず、 ノードが新規に作られる、かも… えっ!? 102
103.
中身はだいたい分かった。 で、使い方は? unordered_map さんの心のつぶやき あ~また新しいのが来たのか。 おんなじキーあったら追加できないんだが、 emplace の引数は得体が知れんからなぁ… しゃ~ない、一旦ノード作ってから 比較するか… 103
104.
中身はだいたい分かった。 で、使い方は? 新規ノードを作る ⇓ アロケータでメモリ割り当てる しかも、重複してたら破棄する ⇓ 効率悪い… 104
105.
中身はだいたい分かった。 で、使い方は? 結論 emplace いいんだけど、 追加されるかどうかわからない時は 慎重に… 105
106.
中身はだいたい分かった。 で、使い方は? ちなみに、unordered_multimap とかは 必ず追加だから平気な模様。 あと、boost.unordered は、 emplace
の最初の引数の型が key の型と一致する場合には、 ノード構築前に 重複チェックしてくれる模様。 106
Editor's Notes
自主クソザコ枠
某主催者に誘われたから
メンバ関数 バケツ数:bucket_count() 要素数:size()
最大消費量
最大消費量
最大消費量
最新版を基準に時折過去のバージョンも…
実際、1件ずつ insert して言った後、イテレータで全要素を出力すると、追加した逆順で出力される
libstdc++ のコメントに、vector と forward_list をくっつけた物って書いてあった…
規格によれば、要素数は計算量が定数時間じゃなきゃダメ
違うのもいるけど…
各実装の最新版について、ちょっと説明
libstdc++ と同じ理由だと思うが、次にリハッシュが起きる要素数を持ってる。
int は 4 バイトだけど、ポインタが 8 バイトなので、アラインメントの関係で16バイトになる。
内部実装の__unordered_set とかを使えば可能っぽい… 試してない…
これだけじゃあんまりなので…
よく見る(?)、各メンバに std::hash を適用した結果を xor するのはダメらしい…
バケツ系とか、使い道がわからない… 逆に連想コンテナにはある、一部のメンバ関数は無い lower_bound、upper_bound とか…
男は後ろを振り向かない
アキラさんのブログに記事があるよ!
EMC++ にも、ちまつと触れられてる…
Download now