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でお願いします