@@ -790,10 +790,12 @@ int main()
790790}
791791~~~
792792
793- ` begin ` に対する` rbegin ` の実装は以下のようになる。残りは自分で実装してみよう 。
793+ ` begin ` に対する` rbegin/rend ` の実装は以下のようになる。` crbegin/crend ` は自分で実装してみよう 。
794794
795795~~~ c++
796796reverse_iterator rbegin () noexcept
797+ { return reverse_iterator{ last } ; }
798+ reverse_iterator rend() noexcept
797799{ return reverse_iterator{ first } ; }
798800~~~
799801
@@ -945,6 +947,115 @@ size_type capacity() const noexcept
945947}
946948~~~
947949
948- ## researve
950+ ### 要素アクセス
949951
952+ #### operator [ ]
950953
954+ ` std::vector ` の` operator [] ` 相当のものを簡易vectorにも実装しよう。
955+
956+ ~~~ cpp
957+ int main ()
958+ {
959+ std::vector<int> v = {1,2,3,4,5} ;
960+ v[1] ; // 2
961+ v[3] ; // 4
962+ }
963+ ~~~
964+
965+ ` operator [] ` は非const版とconst版の2種類がある。
966+
967+ ~~~ c++
968+ reference operator []( size_type i )
969+ { return first[ i] ; }
970+ const_reference operator [ ] ( size_type i ) const
971+ { return first[ i] ; }
972+ ~~~
973+
974+ #### at
975+
976+ メンバー関数`at(i)`は`operator [](i)`と同じだが、範囲外のインデックスを指定した場合、`std::out_of_range`が例外として投げられる。
977+
978+ ~~~cpp
979+ int main()
980+ {
981+ try {
982+ // 有効なインデックスはv[0]からv[4]まで
983+ std::vector<int> v = {1,2,3,4,5} ;
984+ v[0] = 0 ; // OK
985+ v[3] = 0 ; // OK
986+ v[5] = 0 ; // エラー
987+ } catch( std::out_of_range e )
988+ {
989+ std::cout << e.what() ;
990+ }
991+ }
992+ ~~~
993+
994+ 実装はインデックスを` size() ` と比較して、範囲外であれば` std::out_of_range ` をthrowする。` operator [] ` と同じく、非const版とconst版がある。
995+
996+ ~~~ c++
997+ reference at ( size_type i )
998+ {
999+ if ( i >= size() )
1000+ throw std::out_of_range( "index is out of range." ) ;
1001+
1002+ return first[i] ;
1003+ }
1004+ const_reference at( size_type i ) const
1005+ {
1006+ if ( i >= size() )
1007+ throw std::out_of_range( "index is out of range." ) ;
1008+
1009+ return first[i] ;
1010+ }
1011+ ~~~
1012+
1013+ #### front/back
1014+
1015+ `front()`は先頭要素へのリファレンスを返す。
1016+
1017+ `back()`は末尾の要素へのリファレンスを返す
1018+
1019+ ~~~cpp
1020+ int main()
1021+ {
1022+ std::vector<int> v = {1,2,3,4,5} ;
1023+ v.front() ; // 1
1024+ v.back() ; // 5
1025+ }
1026+ ~~~
1027+
1028+ これにもconst版と非const版がある。` vector ` の` last ` が最後の要素の次のポインターを指していることに注意。
1029+
1030+ ~~~ c++
1031+ reference front ()
1032+ { return first ; }
1033+ const_reference front() const
1034+ { return first ; }
1035+ reference back()
1036+ { return last - 1 ; }
1037+ const_reference back() const
1038+ { return last - 1 ; }
1039+ ~~~
1040+
1041+ #### data
1042+
1043+ `data()`は先頭の要素へのポインターを返す。
1044+
1045+ ~~~cpp
1046+ int main()
1047+ {
1048+ std::vector<int> v = {1,2,3} ;
1049+ int * ptr = v.data() ;
1050+ *ptr ; // 1
1051+ }
1052+ ~~~
1053+
1054+ 実装は` first ` を返すだけだ。
1055+
1056+ ~~~ c++
1057+ pointer data () noexcept
1058+ { return first ; }
1059+ const_pointer data() const noexcept
1060+ { return first ; }
1061+ ~~~
0 commit comments