Upgrade to Pro — share decks privately, control downloads, hide ads and more …

C++でコンテナを再実装する課題をざっくり理解する / A quick understanding of a project to reimplement containers in C++

nafuka
November 16, 2021

C++でコンテナを再実装する課題をざっくり理解する / A quick understanding of a project to reimplement containers in C++

nafuka

November 16, 2021
Tweet

More Decks by nafuka

Other Decks in Programming

Transcript

  1. C++でコンテナを再実装する課題 をざっくり理解する nfukada (nafuka11)

  2. • 課題概要 • 各コンテナの概要 ◦ vector ◦ map ◦ stack

    ◦ set • 参考文献 目次
  3. 課題概要 • どんな課題? • コンテナとは • どうやって実装する? • 実装するコンテナ

  4. C++で コンテナ を再実装する課題 → コンテナとは? 課題概要:どんな課題?

  5. C++では以下の機能を使ってデータの扱いを共通化している • データの格納方法:コンテナ • 要素へのアクセス:イテレータ • データの操作:アルゴリズム 今回の課題では、データを格納する コンテナ と、

    コンテナの要素にアクセスする イテレータ を実装する 課題概要:コンテナとは
  6. コンテナ 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
  7. C++の クラス と テンプレート 使って実装する 課題概要:どうやって実装する?

  8. • C言語の構造体をもっと便利にしたもの • データとそのデータを操作する関数をまとめられる ◦ データ:メンバ変数 • クラスの変数(オブジェクト)を 作った時、破棄した時の処理を関数に定義できる ◦

    コンストラクタ、デストラクタ ◦ initialize_struct()みたいな関数をいちいち呼び出さなくてよい 課題概要:どうやって実装する?:クラス
  9. • コードの雛形(テンプレート)を作れる • 型を指定したら、その型のコードをコンパイル時に作ってくれる ◦ void *を使わなくていい 課題概要:どうやって実装する?:テンプレート

  10. • vector • map • stack • set(ボーナス) 課題概要:実装するコンテナ

  11. vector • データ構造 • メンバ変数 • 関数

  12. 固定長配列にデータを追加・削除する データ数が配列長を超えるなら、配列を再確保する vector:データ構造 1 2 3 4 5 1 2

    3 4 5 未初期化領域
  13. vector:メンバ変数 1 2 3 4 5 first last capacity_last alloc(Allocator)

    C言語における mallocやfreeをし てくれる
  14. • コンストラクタ/デストラクタ • 要素のアクセス(先頭/末尾/n番目) • 要素の再確保 • 要素の追加/削除 • vector同士の比較/入れ替え

    などなど…全部で48個、外部で使える関数があります vector:関数
  15. map • データ構造 • メンバ変数 • 関数

  16. 木のような構造です。詳細は 赤黒木を理解する のスライドを参照ください map:データ構造 3 “Three” 1 “One” 10 “Ten”

    2 “Two” 0 “Zero” キー 値
  17. tree(クラス) map:メンバ変数 3 “Three” 1 “One” 10 “Ten” 2 “Two”

    0 “Zero” key_comp value_comp nil NULL相当 の要素 begin end compare size
  18. • コンストラクタ/デストラクタ • 要素のアクセス(先頭/末尾/キー) ◦ 例:map[1]で ”One” を取得 • 要素の追加/削除

    • 要素の検索 • map同士の比較/入れ替え などなど…全部で44個ぐらい関数があります map:関数
  19. stack • データ構造 • メンバ変数 • 関数

  20. 他のコンテナをラップして stackのような操作を実現する stack:データ構造 1 2 3 4 5

  21. stack:メンバ変数 1 2 3 4 c

  22. • コンストラクタ • 要素、要素数の取得 • 要素の追加/削除 • stack同士の比較 13個関数があります stack:関数

  23. set • データ構造 • メンバ変数 • 関数

  24. mapのキーがない版です set:データ構造 3 1 10 0 2

  25. tree set:メンバ変数 3 1 10 0 2 compare ダミー begin

    end nil NULL相当 の要素 compare size
  26. mapとほぼ同じ キーから値を取ってくる系の関数がなくなってます 関数は39個ぐらいです set:関数

  27. 参考文献 • 参考URL • 参考書籍

  28. • 江添亮の入門C++ ◦ vectorの実装が参考になります • hacking C++ ◦ 各コンテナを図で説明していて分かりやすいです •

    cplusplus.com と cppreference.com ◦ cppreference.comだとC++98扱いになってる関数があり注意(map::atなど) • Clangのソース と GCCのソース • C++98でMapを再実装する - Nafuka Lines ◦ 自分の記事です 参考URL
  29. • 『ストラウストラップのプログラミング入門』 ◦ コンテナ、イテレータ、アルゴリズムの説明が分かりやすいです • 『プログラミング言語C++ 第4版』 ◦ enable_ifの実装が参考になります •

    『アルゴリズムイントロダクション 第3版 第1巻』 ◦ 赤黒木の実装で参考にしました 参考書籍
  30. • 課題概要 • 各コンテナの概要 ◦ vector ◦ map ◦ stack

    ◦ set • 参考文献 目次
  31. おしまい 疑問点などありましたら Discordのチャンネル or DMでお願いします