C++でコンテナを再実装する課題をざっくり理解する / A quick understanding of a project to reimplement containers in C++
by
nafuka
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
C++でコンテナを再実装する課題 をざっくり理解する nfukada (nafuka11)
Slide 2
Slide 2 text
● 課題概要 ● 各コンテナの概要 ○ vector ○ map ○ stack ○ set ● 参考文献 目次
Slide 3
Slide 3 text
課題概要 ● どんな課題? ● コンテナとは ● どうやって実装する? ● 実装するコンテナ
Slide 4
Slide 4 text
C++で コンテナ を再実装する課題 → コンテナとは? 課題概要:どんな課題?
Slide 5
Slide 5 text
C++では以下の機能を使ってデータの扱いを共通化している ● データの格納方法:コンテナ ● 要素へのアクセス:イテレータ ● データの操作:アルゴリズム 今回の課題では、データを格納する コンテナ と、 コンテナの要素にアクセスする イテレータ を実装する 課題概要:コンテナとは
Slide 6
Slide 6 text
コンテナ vector, map, stack, set イテレータ ++iter, --iter, *iter アルゴリズム sort, swap, min, max 1 2 3 4 5 2 B 1 A 3 C 1 2 3 4 5 ++ * -- 3 5 1 4 2 1 2 3 4 5 1 2 3
Slide 7
Slide 7 text
C++の クラス と テンプレート 使って実装する 課題概要:どうやって実装する?
Slide 8
Slide 8 text
● C言語の構造体をもっと便利にしたもの ● データとそのデータを操作する関数をまとめられる ○ データ:メンバ変数 ● クラスの変数(オブジェクト)を 作った時、破棄した時の処理を関数に定義できる ○ コンストラクタ、デストラクタ ○ initialize_struct()みたいな関数をいちいち呼び出さなくてよい 課題概要:どうやって実装する?:クラス
Slide 9
Slide 9 text
● コードの雛形(テンプレート)を作れる ● 型を指定したら、その型のコードをコンパイル時に作ってくれる ○ void *を使わなくていい 課題概要:どうやって実装する?:テンプレート
Slide 10
Slide 10 text
● vector ● map ● stack ● set(ボーナス) 課題概要:実装するコンテナ
Slide 11
Slide 11 text
vector ● データ構造 ● メンバ変数 ● 関数
Slide 12
Slide 12 text
固定長配列にデータを追加・削除する データ数が配列長を超えるなら、配列を再確保する vector:データ構造 1 2 3 4 5 1 2 3 4 5 未初期化領域
Slide 13
Slide 13 text
vector:メンバ変数 1 2 3 4 5 first last capacity_last alloc(Allocator) C言語における mallocやfreeをし てくれる
Slide 14
Slide 14 text
● コンストラクタ/デストラクタ ● 要素のアクセス(先頭/末尾/n番目) ● 要素の再確保 ● 要素の追加/削除 ● vector同士の比較/入れ替え などなど…全部で48個、外部で使える関数があります vector:関数
Slide 15
Slide 15 text
map ● データ構造 ● メンバ変数 ● 関数
Slide 16
Slide 16 text
木のような構造です。詳細は 赤黒木を理解する のスライドを参照ください map:データ構造 3 “Three” 1 “One” 10 “Ten” 2 “Two” 0 “Zero” キー 値
Slide 17
Slide 17 text
tree(クラス) map:メンバ変数 3 “Three” 1 “One” 10 “Ten” 2 “Two” 0 “Zero” key_comp value_comp nil NULL相当 の要素 begin end compare size
Slide 18
Slide 18 text
● コンストラクタ/デストラクタ ● 要素のアクセス(先頭/末尾/キー) ○ 例:map[1]で ”One” を取得 ● 要素の追加/削除 ● 要素の検索 ● map同士の比較/入れ替え などなど…全部で44個ぐらい関数があります map:関数
Slide 19
Slide 19 text
stack ● データ構造 ● メンバ変数 ● 関数
Slide 20
Slide 20 text
他のコンテナをラップして stackのような操作を実現する stack:データ構造 1 2 3 4 5
Slide 21
Slide 21 text
stack:メンバ変数 1 2 3 4 c
Slide 22
Slide 22 text
● コンストラクタ ● 要素、要素数の取得 ● 要素の追加/削除 ● stack同士の比較 13個関数があります stack:関数
Slide 23
Slide 23 text
set ● データ構造 ● メンバ変数 ● 関数
Slide 24
Slide 24 text
mapのキーがない版です set:データ構造 3 1 10 0 2
Slide 25
Slide 25 text
tree set:メンバ変数 3 1 10 0 2 compare ダミー begin end nil NULL相当 の要素 compare size
Slide 26
Slide 26 text
mapとほぼ同じ キーから値を取ってくる系の関数がなくなってます 関数は39個ぐらいです set:関数
Slide 27
Slide 27 text
参考文献 ● 参考URL ● 参考書籍
Slide 28
Slide 28 text
● 江添亮の入門C++ ○ vectorの実装が参考になります ● hacking C++ ○ 各コンテナを図で説明していて分かりやすいです ● cplusplus.com と cppreference.com ○ cppreference.comだとC++98扱いになってる関数があり注意(map::atなど) ● Clangのソース と GCCのソース ● C++98でMapを再実装する - Nafuka Lines ○ 自分の記事です 参考URL
Slide 29
Slide 29 text
● 『ストラウストラップのプログラミング入門』 ○ コンテナ、イテレータ、アルゴリズムの説明が分かりやすいです ● 『プログラミング言語C++ 第4版』 ○ enable_ifの実装が参考になります ● 『アルゴリズムイントロダクション 第3版 第1巻』 ○ 赤黒木の実装で参考にしました 参考書籍
Slide 30
Slide 30 text
● 課題概要 ● 各コンテナの概要 ○ vector ○ map ○ stack ○ set ● 参考文献 目次
Slide 31
Slide 31 text
おしまい 疑問点などありましたら Discordのチャンネル or DMでお願いします