More Related Content
Similar to クソザコ鳥頭が非順序連想コンテナに入門してみた (20)
クソザコ鳥頭が非順序連想コンテナに入門してみた
- 30. 非順序連想コンテナって
どんな構造?
↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑
これ を こう
するのは結構大変なので、あらかじめ
バケツ数を増やしておくこともできる。
0 1 2 0 1 2 3
30
- 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
- 99. 中身はだいたい分かった。
で、使い方は?
1. c[key] = value;
① keyが既にコンテナにある時は、
値が value で上書かれる。
② key がまだコンテナに無い時は、
デフォルト値で新規ノード作っちゃう。
新規ノード作る時に、
まずデフォルトコンストラクタで
value の型の要素を構築してから
value を代入することになる
⇓
型によっては効率悪い
そんなん百も
承知ですよね…
99
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++ にも、ちまつと触れられてる…