template <typename T> class myvector { public: using value_type = T; using size_type = size_t; using difference_type = ptrdiff_t; using reference = value_type&; using const_reference = const value_type&; using pointer = value_type*; using const_pointer = const value_type*; using iterator = value_type*; using const_iterator = const value_type*; using reverse_iterator = std::reverse_iterator<iterator>; using const_reverse_iterator = std::reverse_iterator<const_iterator>; private: pointer heap_ = nullptr; size_type size_ = 0; size_type capacity_ = 0; };上側で11個の public な型定義を行っています。STLコンテナには様々な型を public 定義しておくことが要求されおり、それに従ったものになります。
この中で重要なのは、iterator の定義です。myvector では要素の型のポインタを iterator として定義しています。iterator のコンセプトはかなり巨大で複雑ではあるのですが、myvector は要素を連続メモリ領域に保持するので、通常のポインタが iterator としての役割を果たすことができます。
また、std::reverse_iterator<> という標準テンプレートクラスを使用することで、iterator から reverse_iterator を作成することができます。
下側はメンバ変数と定義となります。当然全て private変数です。
std::vector および std::string の定義には、3つのメンバ変数が必要であることが知られています。myvector では、ヒープ先を指す heap_、現サイズを格納する size_、ヒープの確保サイズを格納する capacity_、の3つをメンバ変数としています。
今後作成する関数にて、heap_ は data() 又は begin()、size_ は size()、capacity_ は capacity() でそれぞれ取得できるようになります。
全ソースコード:
https://github.com/suomesta/myvector/tree/master/002
0 件のコメント:
コメントを投稿