Skip to content

Commit dfb4532

Browse files
committed
追記
1 parent 66f9c10 commit dfb4532

File tree

1 file changed

+113
-2
lines changed

1 file changed

+113
-2
lines changed

033-vector-implementation.md

Lines changed: 113 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -790,10 +790,12 @@ int main()
790790
}
791791
~~~
792792

793-
`begin`に対する`rbegin`の実装は以下のようになる。残りは自分で実装してみよう
793+
`begin`に対する`rbegin/rend`の実装は以下のようになる。`crbegin/crend`は自分で実装してみよう
794794

795795
~~~c++
796796
reverse_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

Comments
 (0)