STLのソースコードを 読んでみよう! ~std::vector編~

8,087 views

Published on

札幌C++勉強会 #5 (2013.12.7)での企画です。
gcc 4.8の<vector>のコードを読むにあたっての補足資料です。

Published in: Technology, Education
0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,087
On SlideShare
0
From Embeds
0
Number of Embeds
2,639
Actions
Shares
0
Downloads
10
Comments
0
Likes
8
Embeds 0
No embeds

No notes for slide

STLのソースコードを 読んでみよう! ~std::vector編~

  1. 1. 札幌C++勉強会 #5 (2013.12.7) STLのソースコードを 読んでみよう! ~std::vector編~ H.Hiro http://hhiro.net/about/ github: maraigue Twitter: @h_hiro_
  2. 2. 自己紹介
  3. 3. H.Hiro • 学位取得に向けて&仕事探しで 格闘中の大学院生 (博士課程**年目) • 研究でアルゴリズムの開発・比較を しているので、C++はお世話に なりっぱなし
  4. 4. 最近作ったもの
  5. 5. 最近作ったもの 置き場所 http://chiraura.hhiro.net/shiritori/ ネタ元 http://codeiq.hatenablog.com/entry/2013/08/27/154926
  6. 6. 最近作ったもの 置き場所 http://chiraura.hhiro.net/shiritori/ ネタ元 ※ただしコードはRuby http://codeiq.hatenablog.com/entry/2013/08/27/154926
  7. 7. 今日やること
  8. 8. STLの std::vectorの ソースコードを読む
  9. 9. 確認
  10. 10. STL って何ですか
  11. 11. STLとは • Standard Template Libraryの略 • C++における標準ライブラリの一部 主にデータ構造・アルゴリズムを提供する (可変長配列、連結リスト、集合など) • テンプレート機構により、だいたいどんな型に 対しても上記の機構が利用できる std::list<int> // 整数の連結リスト std::list<double> // 浮動小数点数の
  12. 12. std::vector って何ですか
  13. 13. std::vectorとは • 可変長配列のクラス vec = std::vector<double>(24); vec.resize(11); • 添字を指定しての要素アクセスは 定数時間で完了 vec[3] = 3776.0; • ただし配列サイズの変更は、配列サイズに 比例した時間が(最悪ケースで)必要 vec.push_back(3776.0);
  14. 14. 注目して いただきたい点
  15. 15. 1. STLのクラスが どんなソースコードで できてるのか
  16. 16. 2. 普段あまり 注目されない機能
  17. 17. 3. C++11に おける変化
  18. 18. それでは 読んでいきます
  19. 19. 質問割り込み 歓迎
  20. 20. ファイル構成(抜粋) • vector • bits/ • allocator.h • range_access.h • stl_algobase.h • stl_bvector.h • stl_construct.h • stl_uninitialized.h • stl_vector.h
  21. 21. ファイル構成(抜粋) • vector • bits/ • allocator.h • range_access.h • stl_algobase.h • stl_bvector.h • stl_construct.h • stl_uninitialized.h • stl_vector.h
  22. 22. 余談 “bits”って何ですか!
  23. 23. 余談 “bits”って何ですか! → • stackoverflow.com/questions/5368035/ whats-the-meaning-of-bits-in-usr-include-c-4-4-bits • kotobank.jp/ejword/bit?dic=pej4&oid=SPEJ00763800 「細かく刻んだもの」(実装をいくつかの ファイルに)くらいの意味と思われるが はっきりとしたことは不明なよう
  24. 24. コンストラクタ std::vectorのコンストラクタは結構多い explicit vector(const Allocator& a=Allocator()); explicit vector(size_type n); explicit vector(size_type n, const T& value, const Allocator& a=Allocator()); template <class InputIter> vector(InputIter first, InputIter last, const Allocator& a=Allocator()); vector(const vector& x); // C++11 vector(const vector& x, const Allocator& a); vector(vector && x); vector(vector && x, const Allocator& a); vector(initializer_list<T> il, const Allocator& a=Allocator()); http://sites.google.com/site/cpprefjp/reference/vector/vector
  25. 25. コンストラクタ std::vectorのコンストラクタは結構多い explicit vector(const Allocator& a=Allocator()); explicit vector(size_type n); explicit vector(size_type n, const T& value, const Allocator& a=Allocator()); template <class InputIter> vector(InputIter first, InputIter last, const Allocator& a=Allocator()); vector(const vector& x); // C++11 vector(const vector& x, const Allocator& a); vector(vector && x); vector(vector && x, const Allocator& a); vector(initializer_list<T> il, const Allocator& a=Allocator()); http://sites.google.com/site/cpprefjp/reference/vector/vector
  26. 26. 「&&」とは • 「右辺値参照」と呼ばれる機能(C++11で規格化!) • 一見すると代入に見えるのだが、代入元のデータが 破壊されうる Ryukogo x(“Omotenashi”); Ryukogo y = std::move(x); // xは当初の状態が維持されているとは限らない • 一時的にしか使わないオブジェクトを、別の変数に 代入するときに使われる(ムーブセマンティクス) • 参考サイト http://program.station.ez-net.jp/special/handbook/cpp/ syntax/move.asp
  27. 27. 「&&」とは(補足) • 「2変数の中身の入れ替え」のような 一時変数が必然的に必要な場合に有効 • 実際、C++11以降のstd::swapは std::moveを使う仕様になった http://cpplover.blogspot.jp/2012/03/ c11stdswapc03stdswap.html 自分が作ったクラスは、右辺値参照(ムーブ) によるコンストラクタ/代入がないと std::moveに与えられなくなった
  28. 28. コンストラクタ コンストラクタが多い explicit vector(const Allocator& a=Allocator()); explicit vector(size_type n); explicit vector(size_type n, const T& value, const Allocator& a=Allocator()); template <class InputIter> vector(InputIter first, InputIter last, const Allocator& a=Allocator()); vector(const vector& x); // C++11 vector(const vector& x, const Allocator& a); vector(vector&& x); vector(vector&& x, const Allocator& a); vector(initializer_list<T> il, const Allocator& a=Allocator());
  29. 29. allocatorとは • メモリの確保と開放を抽象化したもの • 「確保と開放」の手段を、new/delete以外の 方法に差し替えることが可能になる • 自分でメモリを別途確保していて、それを STLコンテナに使わせたい場合など • 参考サイト: www.geocities.jp/ky_webid/cpp/library/028.html

×