SlideShare a Scribd company logo
1 of 106
クソザコ鳥頭が
非順序連想コンテナに
入門してみた
2015/12/05 鳥頭かりやマン
1
で、お前だれよ?
2
で、お前だれよ?
■名前
⇒刈谷 満(鳥頭かりやマン)
■職業
⇒働かないタイプの社畜(老い先短い)
■普段使用してる言語
⇒ ExcelHogan(好きとは言ってない)
■好きな言語
⇒ C++、Perl5(できるとは言ってない) 3
何でクソザコが
発表してんの?
4
何でクソザコが発表してんの?
※ 意味
てめぇ、ありがたくも cpprefjp 編集させて
やってるんだから Boost.勉強会で発表ぐ
らいしろやゴルァ!
せっかく cpprefjp で
unordered やったんだから、
Boost.勉強会で発表でも
どうですか?※
5
非順序連想コンテナ
とは?
6
非順序連想コンテナとは?
• 今すぐ使用すべき
連想界のスーパーコンテナ
• 速い(検索が)
• 小さい(メモリ使用量が)
• 長い(名前が)
※連想コンテナ比
※
※
※
7
非順序連想コンテナって
どんな構造?
8
非順序連想コンテナって
どんな構造?
非順序連想コンテナ鉄の掟
1. 非順序連想コンテナの要素は「bucket」に
分けて入れられる。
2. 同じハッシュコードのキーは同じ「bucket」
に現れる。
3. 要素が追加されると「bucket」の数は自動
で増えるので、「bucket」あたりの平均要
素数は限度以下に保たれる。
from C++規格書勝手訳
9
bucket?
バゲット?
©佐野研二郎 10
bucket?
bucket
【可算名詞】
バケツ; 手おけ; つるべ.
from 研究社 新英和中辞典
11
非順序連想コンテナって
どんな構造?
つまり…
12
非順序連想コンテナって
どんな構造?
非順序連想コンテナ鉄の掟
1. 非順序連想コンテナの要素はバケツに分
けて入れられる。
13
非順序連想コンテナって
どんな構造?
バケツが何個かあって…
bucket_count() = 3, size() = 0 (empty())
0 1 2 14
非順序連想コンテナって
どんな構造?
赤城さんを入渠追加する場合…
ハッシュ関数でハッシュ値を計算して…
ハッシュ値:55ハッシュ関数
(弾薬最大)
insert(const value_type&) とか…
15
非順序連想コンテナって
どんな構造?
ハッシュ値に従って選ばれた
バケツに入れる!
size() = 1
0 1 2
この場合、
ハッシュ値「55」を
バケツ数「3」で割った
余り「1」に
16
非順序連想コンテナって
どんな構造?
非順序連想コンテナ鉄の掟
2. 同じハッシュコードのキーは同じバケツに
現れる。
17
非順序連想コンテナって
どんな構造?
雷電姉妹を追加する場合、
ハッシュ値は同じなので…
(姉妹だからしょうがないね…)
ハッシュ値:20ハッシュ関数
(弾薬最大)
雷と電で
ハッシュ値が
「衝突」している
18
非順序連想コンテナって
どんな構造?
同じバケツに入れるのです!
size() = 3
0 1 2
ハッシュ値「20」を
バケツ数「3」で割った
余り「2」に
19
非順序連想コンテナって
どんな構造?
ちなみに、バケツ要素数を得る
bucket_size() ってのがあって
0 1 2
0 1 2
20
非順序連想コンテナって
どんな構造?
バケツ内だけのイテレータも取れる
0 1 2
最初は
begin(2), cbegin(2)
最後は
end(2), cend(2)
例によって最後の
要素の一つ先
でもぶっちゃけ
使い道が
わからん…
21
非順序連想コンテナって
どんな構造?
さらに島風を追加する場合…
ハッシュ値:25ハッシュ関数
(弾薬最大)
22
非順序連想コンテナって
どんな構造?
ハッシュ値は違うけど、同じバケツに
なっちゃう…
0 1 2
この場合、
ハッシュ値「25」を
バケツ数「3」で割った
余り「1」に
23
非順序連想コンテナって
どんな構造?
ハッシュ値は違うけど、同じバケツに
なっちゃう…
0 1 2
でも、
ちょっと混み過ぎ
だよね…
24
非順序連想コンテナって
どんな構造?
非順序連想コンテナ鉄の掟
3. 要素が追加されるとバケツの数は自動で
増えるので、バケツあたりの平均要素数
は限度以下に保たれる。
load factor
「占有率」とか「負荷率」とか 25
非順序連想コンテナって
どんな構造?
バケツあたりの平均要素数は、
要素数4/バケツ数3=1.3333…
size() / bucket_count()
これは load_factor() で得られる。
0 1 2 26
非順序連想コンテナって
どんな構造?
上限も max_load_factor() で得られる。
デフォルトは1.0。
⇒やっぱり混み過ぎなので…
0 1 2 27
非順序連想コンテナって
どんな構造?
バケツが自動で増える!(リハッシュと言う)
bucket_count() = 4
(普通はバケツ数もっと増えます…)
0 1 2 3
リハッシュで
バケツが別れた
リハッシュされたら
バケツが分かれた
仲良しハッシュ値が
同じなのでリハッシュ
されてもバケツが
一緒なのです!
28
非順序連想コンテナって
どんな構造?
ちなみに…
29
非順序連想コンテナって
どんな構造?
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
これ を こう
するのは結構大変なので、あらかじめ
バケツ数を増やしておくこともできる。
0 1 2 0 1 2 3
30
非順序連想コンテナって
どんな構造?
n 個以上バケツを確保しておく。
rehash(n)
リハッシュされずに n 個の要素が
格納できるだけのバケツを確保しておく。
reserve(n)
31
非順序連想コンテナって
どんな構造?
n 個以上バケツを確保しておく。
rehash(n)
リハッシュされずに n 個の要素が
格納できるだけのバケツを確保しておく。
reserve(n)
が!
32
非順序連想コンテナって
どんな構造?
ちょっと規格に問題があって、
reserve(n) だと n 個の要素が格納できない…
(LWG Issue 2156)
n を 1 つ増やしておくと良さそう…
cpprefjp の unordered_*::reserve にも書いてあるので見てみてください…
http://cpprefjp.github.io/reference/unordered_set/unordered_set/reserve.html
33
非順序連想コンテナって
どんな構造?
あと、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
で、実際のところ
実装はどうなってんの?
実装を覗いてみました
libstdc++ (GCC)
libc++ (Clang)
boost.unordered
36
で、実際のところ
実装はどうなってんの?
ハッシュテーブルのよく見るイメージ図
from CodeZine のJavaセキュアコーディング入門
バケツ配列
(ノードへの
ポインタ配列)
同一バケツ内の
次の要素を指す
ポインタ
各要素
(ノード)
37
で、実際のところ
実装はどうなってんの?
実装見るまで私もそう思ってました…
from CodeZine のJavaセキュアコーディング入門
同一バケツ内の
次の要素を指す
ポインタ
各要素
(ノード)
バケツ配列
(ノードへの
ポインタ配列)
38
で、実際のところ
実装はどうなってんの?
問題点1
イテレータで
前に進むときに困る
iterator::operator()++
39
で、実際のところ
実装はどうなってんの?
from CodeZine のJavaセキュアコーディング入門
イテレータが
ココを指してる時は
いいけど…
次!
40
で、実際のところ
実装はどうなってんの?
from CodeZine のJavaセキュアコーディング入門
イテレータが
ココを指してる時は
いいけど…
イテレータが
ココを指してる時、
次に進めない…
次?
41
で、実際のところ
実装はどうなってんの?
from CodeZine のJavaセキュアコーディング入門
イテレータが
ココを指してる時は
いいけど…
イテレータが
ココを指してる時、
次に進めない…
そんなん
バケツ配列の次たどって
行けばええやん?
42
で、実際のところ
実装はどうなってんの?
イテレータが
ココを指してる時は
いいけど…
イテレータが
ココを指してる時、
次に進めない…
そんなん
バケツ配列の次たどって
行けばええやん?ダメ!ゼッタイ!
43
で、実際のところ
実装はどうなってんの?
イテレータに対する
操作は定数時間で
なければならない!
(ホントは償却定数時間ならいいんだけど、さすがにこれじゃダメ…)
44
で、実際のところ
実装はどうなってんの?
じゃあこんな感じ?
from CodeZine のJavaセキュアコーディング入門
各バケツの最後の
要素は次のバケツの
最初の要素を指す
45
で、実際のところ
実装はどうなってんの?
じゃあこんな感じ?
from CodeZine のJavaセキュアコーディング入門
各バケツの最後の
要素は次のバケツの
最初の要素を指す
libstdc++ 4.6.x までは
この時点でもうダメっぽい…
頼むよ GCC…
46
で、実際のところ
実装はどうなってんの?
問題点2
追加したときに困る
insert(const value_type&) とか
47
で、実際のところ
実装はどうなってんの?
例えばこの状態で…
from CodeZine のJavaセキュアコーディング入門
このバケツに
追加すると…
48
で、実際のところ
実装はどうなってんの?
例えばこの状態で…
from CodeZine のJavaセキュアコーディング入門
これを…
こうしなきゃ
ならない…
このバケツに
追加すると…
49
で、実際のところ
実装はどうなってんの?
例えばこの状態で…
from CodeZine のJavaセキュアコーディング入門
これを…
こうしなきゃ
ならない…
このバケツに
追加すると…
そんなん
バケツ配列の前(ry
50
で、実際のところ
実装はどうなってんの?
例えばこの状態で…
from CodeZine のJavaセキュアコーディング入門
これを…
こうしなきゃ
ならない…
このバケツに
追加すると…
そんなん
バケツ配列の前(ryダメ!ゼッタイ!
51
で、実際のところ
実装はどうなってんの?
1件 insert も
定数時間でなければ
ならない!
(これも償却定数時間ならいいんだけど、やっぱりダメ…)
52
で、実際のところ
実装はどうなってんの?
じゃあどうするの…
from CodeZine のJavaセキュアコーディング入門
こいつを頭に
つけちゃえば
いい!
つまり、
バケツ順に
並んでない…
53
で、実際のところ
実装はどうなってんの?
問題点3
削除の時も困る
erase(const key_type&) とか
54
で、実際のところ
実装はどうなってんの?
たとえば erase(const key_type&)
from CodeZine のJavaセキュアコーディング入門
ココをキー指定で
削除したいときは…
キーから
ハッシュ値を計算して
ここからたどって…
55
で、実際のところ
実装はどうなってんの?
たとえば erase(const key_type&)
from CodeZine のJavaセキュアコーディング入門
一つ前のポインタを
修正しなきゃならないけど…
要素を削除して…
どうやって
逆向きに
たどるねん…
56
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列からは
一つ前の要素を指す
初っ端は
前が無いから
ダミーを指す
めっさ
カオス…
57
で、実際のところ
実装はどうなってんの?
その他
イメージ図には
普通描かれないけど、
いろいろある
58
で、実際のところ
実装はどうなってんの?
バケツ配列だって
アロケータで確保するだろJK
⇓
バケツ配列へのポインタが必要
59
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列
へのポインタ
60
で、実際のところ
実装はどうなってんの?
バケツって
今何個あるんだっけ?
⇓
バケツ数
bucket_count()
61
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列
へのポインタ
バケツ数
62
で、実際のところ
実装はどうなってんの?
要素数返すのに
いちいち数えてたらヤバい
(計算量的な意味で)
⇓
要素数
size()
63
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列
へのポインタ
バケツ数
要素数
64
で、実際のところ
実装はどうなってんの?
さっき出てきた
max_load_factor()
は?
65
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列
へのポインタ
バケツ数
要素数
最大負荷率
66
で、実際のところ
実装はどうなってんの?
ハッシュ関数、キー比較関数、アロケータは
どこ行った
⇓
ハッシュ関数、キー比較関数、アロケータ
hash_function()
key_eq()
get_allocator()
67
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列
へのポインタ
バケツ数
要素数
最大負荷率
ハッシュ関数
オブジェクト
キー比較関数
オブジェクト
アロケータ
オブジェクト
実際のところ、これら3つは
大抵状態を持たないので、
空基底最適化によって
サイズを0にしている実装もある
(EBO:Empty Base Optimization)
68
で、実際のところ
実装はどうなってんの?
こんな感じ?
from CodeZine のJavaセキュアコーディング入門
ダミー
バケツ配列
へのポインタ
バケツ数
要素数
最大負荷率
ハッシュ関数
オブジェクト
キー比較関数
オブジェクト
アロケータ
オブジェクト
ちなみに、
このへんの左側の箱が
非順序連想コンテナの
オブジェクト本体になる
(あとはアロケータで確保)
69
で、実際のところ
実装はどうなってんの?
ちょっと
正しく理解出来てるか
自信が無かったので、
オブジェクトのサイズを
実際に見てみた
70
で、実際のところ
実装はどうなってんの?
対象
libc++ 3.0~3.8(Clang)
libstdc++ 4.6.4~6.0.0(GCC)
boost.unordered 1.47~1.59
いずれも、long とポインタが64bitのケース
(LP64モデル)
71
で、実際のところ
実装はどうなってんの?
調べ方
基本、sizeof(unordered_set<int>)を見てみる。
加えて、各関数オブジェクトに 64bit(8バイト)
の状態を持たせたケースも見てみる。
72
で、実際のところ
実装はどうなってんの?
基本 ハッシュや
キー比較に
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
で、実際のところ
実装はどうなってんの?
基本 ハッシュや
キー比較に
8バイト
アロケータに
8バイト
全部に
8バイト
(計24バイト)
libc++ 3.0~3.8 40 48(+8) 56(+16) 72(+32)
libc++ 3.0~3.8
EBOも効いててだいたい順当。
ただし、アロケータは、バケツ配列用と
ノード用の2つ持ってる。
(両方はいらないと思うんだけど…)
74
で、実際のところ
実装はどうなってんの?
libc++ 3.0~3.8
こんな
イメージ
です
(カッコ内はバイト数)
バケツ配列へのポインタ(8)
バケツ配列用アロケータ(0, 8)
バケツ数(8)
ノード用アロケータ(0, 8)
ダミーノード(8)
ハッシュ関数オブジェクト(0, 8)
要素数(8)
キー比較関数オブジェクト(0, 8)
最大負荷率(4)
ココでEBO
ココでEBO
ココでEBO
ココでEBO
75
で、実際のところ
実装はどうなってんの?
基本 ハッシュや
キー比較に
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
で、実際のところ
実装はどうなってんの?
libstdc++ 4.9.1~6.0
こんな
イメージ
です
(カッコ内はバイト数)
ハッシュ関数オブジェクト(0, 8)
キー比較関数オブジェクト(0, 8)
アロケータオブジェクト(0, 8)
バケツ配列へのポインタ(8)
バケツ数(8)
ダミーノード(8)
要素数(8)
最大負荷率(4)
次にリハッシュされる要素数(8)
1要素のバケツ配列(8)
ココと
自クラスと
でEBO
77
で、実際のところ
実装はどうなってんの?
ちなみに、libstdc++ 4.8.0~4.8.5 は、
状態を持つハッシュ関数オブジェクト
使うとコンパイルエラーが出ました。
(static_assertで失敗)
普通はあんまり
そんなことしないと
思うけど…
78
で、実際のところ
実装はどうなってんの?
基本 ハッシュや
キー比較に
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
で、実際のところ
実装はどうなってんの?
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
で、実際のところ
実装はどうなってんの?
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
で、実際のところ
実装はどうなってんの?
ノードサイズ
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
で、実際のところ
実装はどうなってんの?
つまり、
1. libc++ と boost 1.48以降はハッシュ値は
一度計算するとノードに保存しとく。
2. libstdc++ と boost 1.47 は毎回計算する。
と、思ったら、libstdc++ 4.8.0 以降については、
マニュアルに記載がありました!
84
で、実際のところ
実装はどうなってんの?
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
で、実際のところ
実装はどうなってんの?
ちなみに、GCC 4.6.x と 4.7.x については、
制御する方法は無いっぽい…
もしあったら教えてください。
内部実装を直接使えば制御できるっぽいけど…
86
中身はだいたい分かった。
で、使い方は?
87
中身はだいたい分かった。
で、使い方は?
連想コンテナと
だいたい同じです!
(完)
88
中身はだいたい分かった。
で、使い方は?
最大の違いはハッシュ!
(あたりまえ)
ハッシュ関数が悪いと
めっさ性能が悪くなるので、
気をつけよう!(どうやって…)
89
中身はだいたい分かった。
で、使い方は?
規格には自前のハッシュ関数
作るのを支援してくれる機構は
(まだ?)無い…
⇓
作るのムズいので、
Boost.Functional/Hash ですかね…
90
中身はだいたい分かった。
で、使い方は?
あと、連想コンテナには無い
メンバ関数もいくつかあるけど、
(バケツ系とか)、
あんまり使う気がしない…
せいぜい、rehash と reserve ですかね…
(最初の方で説明した奴)
91
中身はだいたい分かった。
で、使い方は?
連想コンテナ
• 双方向イテレータ
• 昇順にならんでる
• 変更操作でイテ
レータが無効にな
らない
非順序連想コンテナ
• 前方向イテレータ
• 順序って何?
• 変更操作でイテ
レータが無効にな
るかも(リハッシュ)
イテレータにはこんな違いが…
92
中身はだいたい分かった。
で、使い方は?
あ!
C++14 で連想コンテナに追加された、
異種混合比較※は、
非順序連想コンテナには
無いです!(残念!)
ハッシュ値が必要だから仕方ないね…
※ string がキーのコンテナを検索する時に、const char* 渡したりする奴
http://faithandbrave.hateblo.jp/entry/20131121/1385013127
93
中身はだいたい分かった。
で、使い方は?
要素追加時にも
ちょっとした違いが…
insert(const_iterator it, ...);
emplace_hint(const_iterator it, ...);
⇓
it は意味なし!
94
中身はだいたい分かった。
で、使い方は?
要素追加時にも
ちょっとした違いが…
insert(const_iterator it, ...);
emplace_hint(const_iterator it, ...);
⇓
it は意味なし!
どっちにしろ、
ハッシュ値からたどる
必要があるので…
95
中身はだいたい分かった。
で、使い方は?
最後に、
せっかく要素追加が出てきたので、
insert と emplace の使い分けを。
(連想コンテナと一緒だけど…)
96
中身はだいたい分かった。
で、使い方は?
emplace すごいよね!
コンテナ内に直接構築できるし!
じゃあ下の例だったらどれ使う?
1. c[key] = value;
2. c.insert(make_pair(key, value));
3. c.emplace(key, value);
97
中身はだいたい分かった。
で、使い方は?
1. c[key] = value;
① keyが既にコンテナにある時は、
値が value で上書かれる。
② key がまだコンテナに無い時は、
デフォルト値で新規ノード作っちゃう。
98
中身はだいたい分かった。
で、使い方は?
1. c[key] = value;
① keyが既にコンテナにある時は、
値が value で上書かれる。
② key がまだコンテナに無い時は、
デフォルト値で新規ノード作っちゃう。
新規ノード作る時に、
まずデフォルトコンストラクタで
value の型の要素を構築してから
value を代入することになる
⇓
型によっては効率悪い
そんなん百も
承知ですよね…
99
中身はだいたい分かった。
で、使い方は?
2. c.insert(make_pair(key, value));
① key が既にコンテナにある時は、
値は上書かれない。
② key がまだコンテナに無い時だけ、
ノードが新規に作られる。 何を当たり前の
ことを…
100
中身はだいたい分かった。
で、使い方は?
3. c.emplace(key, value);
① key が既にコンテナにある時は、
値は上書かれない。(insert と一緒)
② key の有無に関わらず、
ノードが新規に作られるかも…
101
中身はだいたい分かった。
で、使い方は?
3. c.emplace(key, value);
① key が既にコンテナにある時は、
値は上書かれない。(insert と一緒)
② key の有無に関わらず、
ノードが新規に作られる、かも…
えっ!?
102
中身はだいたい分かった。
で、使い方は?
unordered_map さんの心のつぶやき
あ~また新しいのが来たのか。
おんなじキーあったら追加できないんだが、
emplace の引数は得体が知れんからなぁ…
しゃ~ない、一旦ノード作ってから
比較するか…
103
中身はだいたい分かった。
で、使い方は?
新規ノードを作る
⇓
アロケータでメモリ割り当てる
しかも、重複してたら破棄する
⇓
効率悪い…
104
中身はだいたい分かった。
で、使い方は?
結論
emplace いいんだけど、
追加されるかどうかわからない時は
慎重に…
105
中身はだいたい分かった。
で、使い方は?
ちなみに、unordered_multimap とかは
必ず追加だから平気な模様。
あと、boost.unordered は、
emplace の最初の引数の型が
key の型と一致する場合には、
ノード構築前に
重複チェックしてくれる模様。
106

More Related Content

What's hot

組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門
Toru Matsuoka
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
Kumazaki Hiroki
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
Unity Technologies Japan K.K.
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
Genya Murakami
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

What's hot (20)

ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
レイトレ空間構造入門
レイトレ空間構造入門レイトレ空間構造入門
レイトレ空間構造入門
 
冬のLock free祭り safe
冬のLock free祭り safe冬のLock free祭り safe
冬のLock free祭り safe
 
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
【Unite Tokyo 2018 Training Day】C#JobSystem & ECSでCPUを極限まで使い倒そう ~C# JobSystem 編~
 
Gstreamer Basics
Gstreamer BasicsGstreamer Basics
Gstreamer Basics
 
.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理.NET Core 3.0時代のメモリ管理
.NET Core 3.0時代のメモリ管理
 
【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things【Unite Tokyo 2019】Understanding C# Struct All Things
【Unite Tokyo 2019】Understanding C# Struct All Things
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!すごい constexpr たのしくレイトレ!
すごい constexpr たのしくレイトレ!
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
マルチコアを用いた画像処理
マルチコアを用いた画像処理マルチコアを用いた画像処理
マルチコアを用いた画像処理
 
(文献紹介)HDR+, Night Sight
(文献紹介)HDR+, Night Sight(文献紹介)HDR+, Night Sight
(文献紹介)HDR+, Night Sight
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装高速な倍精度指数関数expの実装
高速な倍精度指数関数expの実装
 
CUDAプログラミング入門
CUDAプログラミング入門CUDAプログラミング入門
CUDAプログラミング入門
 

Viewers also liked

よくわかるHopscotch hashing
よくわかるHopscotch hashingよくわかるHopscotch hashing
よくわかるHopscotch hashing
Kumazaki Hiroki
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンド
YUKI Kaoru
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフロー
add20
 
Google analytics常用指标及解读
Google analytics常用指标及解读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...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
 

Viewers also liked (20)

error handling using expected
error handling using expectederror handling using expected
error handling using expected
 
女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++女性のためのC++コミュニティ Ladies++
女性のためのC++コミュニティ Ladies++
 
SDL2の紹介
SDL2の紹介SDL2の紹介
SDL2の紹介
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#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 mergeBoost tour 1.60.0 merge
Boost tour 1.60.0 merge
 
Boost tour 1.60.0
Boost tour 1.60.0Boost tour 1.60.0
Boost tour 1.60.0
 
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
二分探索法で作る再帰呼び出しできるCプリプロセッサマクロ
 
左と右の話
左と右の話左と右の話
左と右の話
 
よくわかるHopscotch hashing
よくわかるHopscotch hashingよくわかるHopscotch hashing
よくわかるHopscotch hashing
 
Boost container feature
Boost container featureBoost container feature
Boost container feature
 
emcjp Item 42
emcjp Item 42emcjp Item 42
emcjp Item 42
 
Emcjp item21
Emcjp item21Emcjp item21
Emcjp item21
 
Multi paradigm design
Multi paradigm designMulti paradigm design
Multi paradigm design
 
Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料Effective Modern C++勉強会#4 Item 17, 18資料
Effective Modern C++勉強会#4 Item 17, 18資料
 
Gitのよく使うコマンド
Gitのよく使うコマンドGitのよく使うコマンド
Gitのよく使うコマンド
 
バージョン管理のワークフロー
バージョン管理のワークフローバージョン管理のワークフロー
バージョン管理のワークフロー
 
南極マラソン報告会 半原小学校スライド
南極マラソン報告会 半原小学校スライド南極マラソン報告会 半原小学校スライド
南極マラソン報告会 半原小学校スライド
 
Entrepreneurial lessons apr2012
Entrepreneurial lessons apr2012Entrepreneurial lessons apr2012
Entrepreneurial lessons apr2012
 
Google analytics常用指标及解读
Google analytics常用指标及解读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...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...
 

Similar to クソザコ鳥頭が非順序連想コンテナに入門してみた

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
 
C++でぼくが忘れがちなこと
C++でぼくが忘れがちなことC++でぼくが忘れがちなこと
C++でぼくが忘れがちなこと
Toshihiko Ando
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
digitalghost
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
shoma h
 
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
Yoshitaka Kimisaki
 
Unit Test
Unit TestUnit Test
Unit Test
ykhr
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
 

Similar to クソザコ鳥頭が非順序連想コンテナに入門してみた (20)

Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話C# コンパイラーの書き換え作業の話
C# コンパイラーの書き換え作業の話
 
最近の単体テスト
最近の単体テスト最近の単体テスト
最近の単体テスト
 
Yarudake
YarudakeYarudake
Yarudake
 
C++でぼくが忘れがちなこと
C++でぼくが忘れがちなことC++でぼくが忘れがちなこと
C++でぼくが忘れがちなこと
 
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
実録『すぐわかるPerl』〜社内ツール悲喜こもごも〜
 
資料
資料資料
資料
 
君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない君はまだ,本当のプリプロセスを知らない
君はまだ,本当のプリプロセスを知らない
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
C#言語機能の作り方
C#言語機能の作り方C#言語機能の作り方
C#言語機能の作り方
 
インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編インターフェイス実装の活用例 AS編
インターフェイス実装の活用例 AS編
 
Unit Test
Unit TestUnit Test
Unit Test
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
Rpn and forth 超入門
Rpn and forth 超入門Rpn and forth 超入門
Rpn and forth 超入門
 
Ph per のための php 最適
Ph per のための php 最適Ph per のための php 最適
Ph per のための php 最適
 
デザイナーのためのPHP講座 for WordPress (初級)
デザイナーのためのPHP講座  for WordPress (初級)デザイナーのためのPHP講座  for WordPress (初級)
デザイナーのためのPHP講座 for WordPress (初級)
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
Webページで学ぶJavaScript2013 第1回
Webページで学ぶJavaScript2013 第1回Webページで学ぶJavaScript2013 第1回
Webページで学ぶJavaScript2013 第1回
 
再帰、漸化式、差分方程式とアルゴリズム Gx#20
再帰、漸化式、差分方程式とアルゴリズム   Gx#20再帰、漸化式、差分方程式とアルゴリズム   Gx#20
再帰、漸化式、差分方程式とアルゴリズム Gx#20
 
わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」
わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」
わんくま東京#38 LT 「Func&lt;> と ref / out 小咄」
 

Recently uploaded

Recently uploaded (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 

クソザコ鳥頭が非順序連想コンテナに入門してみた

Editor's Notes

  1. 自主クソザコ枠
  2. 某主催者に誘われたから
  3. メンバ関数 バケツ数:bucket_count() 要素数:size()
  4. 最大消費量
  5. 最大消費量
  6. 最大消費量
  7. 最新版を基準に時折過去のバージョンも…
  8. 実際、1件ずつ insert して言った後、イテレータで全要素を出力すると、追加した逆順で出力される
  9. libstdc++ のコメントに、vector と forward_list をくっつけた物って書いてあった…
  10. 規格によれば、要素数は計算量が定数時間じゃなきゃダメ
  11. 違うのもいるけど…
  12. 各実装の最新版について、ちょっと説明
  13. libstdc++ と同じ理由だと思うが、次にリハッシュが起きる要素数を持ってる。
  14. int は 4 バイトだけど、ポインタが 8 バイトなので、アラインメントの関係で16バイトになる。
  15. 内部実装の__unordered_set とかを使えば可能っぽい… 試してない…
  16. これだけじゃあんまりなので…
  17. よく見る(?)、各メンバに std::hash を適用した結果を xor するのはダメらしい…
  18. バケツ系とか、使い道がわからない… 逆に連想コンテナにはある、一部のメンバ関数は無い lower_bound、upper_bound とか…
  19. 男は後ろを振り向かない
  20. アキラさんのブログに記事があるよ!
  21. EMC++ にも、ちまつと触れられてる…