Slide 1

Slide 1 text

std::basic_string_view std::basic_string_view

Slide 2

Slide 2 text

basic_string_view overview basic_string_view overview basic_string_viewは所有権を持たない 参照もとを変更しない ⽂字列の参照を持ち、なんかいい感じに加⼯して使える 参照して持ち回し、⽂字列の検索や⽐較ができる Tips:⽣⽂字列リテラルは静的に⽣存する #include std::basic_string_viewfunc(){ return hoge ; } intmain(){ //Itisvalidbecauserawstringliteralshavestaticstorageduratioin std::basic_string_viewhoge(); }

Slide 3

Slide 3 text

string とポインタの差異を吸収できる string とポインタの差異を吸収できる //stringでもchar*でも問題なく渡せる voidfunc(std::basic_string_viewstr){ //... }

Slide 4

Slide 4 text

宣⾔等 宣⾔等 以降はメンバに CharT*data_ size_typesize_ を持つもののして進めていきます namespacestd{ template> classbasic_string_view; usingbasic_string_view=basic_string_view; usingu16basic_string_view=basic_string_view; usingu32basic_string_view=basic_string_view; usingwbasic_string_view=basic_string_view; }

Slide 5

Slide 5 text

コンストラクタ コンストラクタ constexprbasic_string_view()noexcept;//(1) constexprbasic_string_view( constbasic_string_view&)noexcept=default;//(2) constexprbasic_string_view(constCharT*str);//(3) constexprbasic_string_view(constCharT*str,size_typelen);//(4)

Slide 6

Slide 6 text

デフォルトコンストラクタ デフォルトコンストラクタ ⽂字列をnullptrとして初期化し、 ⽂字列⻑を0として初期化する string_viewは参照もとがなければならないため、空⽂字列になったりはしない constexprbasic_string_view()noexcept;//(1)

Slide 7

Slide 7 text

コピーコンストラクタ コピーコンストラクタ コピーコンストラクタ コピーもとのbasic_string_viewが参照する⽂字列を参照する constexprbasic_string_view( constbasic_string_view&)noexcept=default;//(2)

Slide 8

Slide 8 text

⽂字列をさすポインタからの構築 ⽂字列をさすポインタからの構築 ⽂字配列からの構築 ⻑さはchar_trait::lengthで調べる(つまりnull終端前提) [str,str+Traits::length(str)) の範囲の⽂字列がアクセス可能な必要がる constexprbasic_string_view(constCharT*str);//(3)

Slide 9

Slide 9 text

⽂字列をさすポインタからの構築 ⽂字列をさすポインタからの構築 ⽂字配列からの構築+⻑さ指定 [str,str+len) の範囲の⽂字列がアクセス可能な必要がる constexprbasic_string_view(constCharT*str,size_typelen);//(4)

Slide 10

Slide 10 text

おまけ おまけ コンストラクタではないが、 std::stringからbasic_string_viewが 構築できる仕組みはこうなっている std::basic_string::operatorbasic_string_view

Slide 11

Slide 11 text

std::stringからstd::basic_string_viewを構築すると としてbasic_string_viewが構築される std::basic_string_view(data(),size())

Slide 12

Slide 12 text

basic_string_view literals basic_string_view literals basic_string_viewを⽣⽂字列リテラルから構築できるもの constexprstring_viewoperator""sv(constchar*str,size_tlen)noexcept; constexpru16string_viewoperator""sv(constchar16_t*str,size_tlen)noexcept; constexpru32string_viewoperator""sv(constchar32_t*str,size_tlen)noexcept; constexprwstring_viewoperator""sv(constwchar_t*str,size_tlen)noexcept; #include intmain(){ usingnamespacestd::literals; std::string_viewsv= hoge sv; }

Slide 13

Slide 13 text

literaloperatorsには⽂字列がコンパイル時に渡るため コンパイラはconstchar[N]という型情報から⽂字列も⻑さを決定できる (できるのでする) この事実から、basic_string_viewのコンストラクタでは構築不可能である null⽂字を含む⽂字列の構築が可能となる コンストラクタで初期化すると⽂字列の⻑さに対して線形時間を要するのに対し リテラルオペレータは定数時間が保証されている ⽣⽂字列リテラルから構築するときは常にoperator svで良さそう #include intmain(){ usingnamespacestd::literals; std::string_viewsv1= a\0b\0c sv;//OK!size=5 std::string_viewsv2( a\0b\0c );//Oops!size=1 }

Slide 14

Slide 14 text

メモ メモ なぜ、次のようなコンストラクタがないのか? 理由は、以下がよく⽰している バッファを多めにとってnull終端してからstring_viewを作っているのに バッファ分読みに⾏かれてれてしまう この理由から、配列の⻑さを⽂字列の⻑さとして⽤いるコンストラクタがない 参考 template constexprbasic_string_view(constCharT(&s)[n]):basic_string_view(s,n){} charx[255]; sprintf(x, hellofolks ); //oops,sv.size()==255! std::string_viewsv(x); https://stackoverflow.com/questions/47337363/why-there-isnt-a- template-constructor-for-stdstring-view

Slide 15

Slide 15 text

member types member types //types usingtraits_type=traits; usingvalue_type=charT; usingpointer=value_type*; usingconst_pointer=constvalue_type*; usingreference=value_type&; usingconst_reference=constvalue_type&; usingconst_iterator=implementation-defined; usingiterator=const_iterator; usingconst_reverse_iterator=reverse_iterator; usingreverse_iterator=const_reverse_iterator; usingsize_type=size_t; usingdifference_type=ptrdiff_t; staticconstexprsize_typenpos=size_type(-1);

Slide 16

Slide 16 text

メンバ関数 メンバ関数 メンバ関数はほぼすべてがbasic_string互換なので、basic_stringにあるメンバがそのま ま存在する また、basic_stringがコンテナであり、basic_string_viewも同様にコンテナであるの で、コンテナインターフェースも存在する

Slide 17

Slide 17 text

イテレータサポート イテレータサポート begin,end cbegin,cend rbegin,rend crbegin,crend イテレータについて解説をしていたら時間が⾜りないので省略

Slide 18

Slide 18 text

Q. なにが返ってくるの? Q. なにが返ってくるの? A. A. 要素型がCharTであるrandomaccessかつcontiguousなiteratorである Note:C++20からconstexpriteratorになる予定

Slide 19

Slide 19 text

capacity capacity constexprsize_typesize()constnoexcept; constexprsize_typelength()constnoexcept; constexprsize_typemax_size()constnoexcept; constexprboolempty()constnoexcept;

Slide 20

Slide 20 text

size size 参照する⽂字列の⻑さが戻る constexpr size_typesize() const;

Slide 21

Slide 21 text

length length 参照する⽂字列の⻑さが戻る constyexpr size_typelength() const;

Slide 22

Slide 22 text

max_size max_size basic_string_viewが参照できる最⼤の⽂字列のがサイズが戻る constexpr type_typemax_size() const;

Slide 23

Slide 23 text

empty empty 参照する⽂字列の⻑さがゼロかどうかが戻る constexprboolempty() const;

Slide 24

Slide 24 text

Element access Element access

Slide 25

Slide 25 text

operator[] operator[] 要求:pos<size() 戻り値:data_[pos] 例外:なし! CharT()を戻すという理由から未定義動作になり得る constexpr const_reference operator[](size_typepos) const;

Slide 26

Slide 26 text

at at 例外:pos>=size()ならout_of_range例外 戻り値:data_[pos] constexpr const_referenceat(size_typepos) const;

Slide 27

Slide 27 text

front front 要求:!empty() 戻り値:data_[0] 例外:なし! constexpr const_reference front()const;

Slide 28

Slide 28 text

back back 要求:!empty() 戻り値:data_[size()-1] 例外:なし! constexpr const_reference back()const;

Slide 29

Slide 29 text

data data 戻り値:data_ 例外:なし! stringのdata()との違い: stringはdata()がnull終端された⽂字列を戻すが、basic_string_viewは初期化時にnull終 端された⽂字列を期待するのでdata()は受け取ったポインタをそのまま戻すだけ constexpr const_pointer data()const;

Slide 30

Slide 30 text

Modifiers Modifiers

Slide 31

Slide 31 text

remove_prefix remove_prefix 要求:n<=size() 作⽤:data_+=n;size-=n;と同様 constexprvoid remove_prefix(size_typen);

Slide 32

Slide 32 text

remove_suffix remove_suffix 要求:n<=size() 作⽤:size_-=n;と同様 constexprvoid remove_suffix(size_typen);

Slide 33

Slide 33 text

swap swap 作⽤:*thisとsを⼊れ替える constexprvoid swap(basic_string_views);

Slide 34

Slide 34 text

String operations String operations

Slide 35

Slide 35 text

copy copy rlenをnとsize()-posの⼩さい⽅とする 例外:pos>size()ならout_of_range例外 要求:参照する⽂字列のポインタの範囲[s,s+rlen)が有効であること. 作⽤:traits::copy(s,data()+pos,rlen)と等価 戻り値:rlen. 複雑性:O(rlen). 確保済みの領域の先頭ポインタを渡してそこへbasic_string_viewの⽂字列をコピーする size_typecopy(charT*s, size_typen, size_typepos=0)const;

Slide 36

Slide 36 text

substr substr 例外:pos>size()ならout_of_range例外 作⽤:部分⽂字列の取得 戻り値:rlenをnとsize()-posの⼩さい⽅とし、basic_string_view(data()+pos, rlen)を戻す constexprbasic_string_viewsubstr(size_typepos=0,size_typen=npos)const;

Slide 37

Slide 37 text

compare compare 部分⽂字列も含めたbasic_string_viewの辞書順⽐較を提供する関数 sv1,sv2をbasic_string_viewとすると次の呼び出し 辞書順の⽐較をを⾏い sv1<sv2なら負の整数、sv1>sv2なら正の整数、sv1==sv2であれば0が戻る 辞書順⽐較: ⽂字数が違う場合、他⽅の⽂字⻑を超えるまで⽂字を⽐較しても順序が定まっていな い場合、⽂字の短い⽅が⼩さい(辞書順) これは全順序を満たす、証明は読者の課題とする sv1.compare(sv2);

Slide 38

Slide 38 text

compare( 続き) compare( 続き) (1):⽂字列の全体同⼠の⽐較 (2):呼び出し元の部分⽂字列と引数の⽂字列全体の⽐較 substr(pos1,n1).compare(str)と等価 (3):部分⽂字列同⼠の⽐較 substr(pos1,n1).compare(str.substr(pos2,n2))と等価 constexprintcompare(basic_string_viewsv)constnoexcept;//(1) constexprintcompare(size_typepos1, size_typen1, basic_string_viewsv)const;//(2) constexprintcompare(size_typepos1, size_typen1, basic_string_viewsv, size_typepos2, size_typen2)const;//(3)

Slide 39

Slide 39 text

compare( 続き) compare( 続き) 基本的に引数がbasic_string_viewから⽂字列のポインタに変わっただけ (4)、(5)はsをbasic_string_view(s)にして先程のものを呼び出すものと等価である (6)は、ポインタが部分⽂字列の先頭を指すものとされており注意が必要 constexprintcompare(constCharT*s)const;//(4) constexprintcompare(size_typepos1, size_typen1, constCharT*s)const;//(5) constexprintcompare(size_typepos1, size_typen1, constCharT*s, size_typen2)const;//(6)

Slide 40

Slide 40 text

starts_with, ends_with starts_with, ends_with coming soon... coming soon...

Slide 41

Slide 41 text

Searching Searching find, rfind, find_first_of, find_last_of, find_first_not_of, and find_last_not_of. find, rfind, find_first_of, find_last_of, find_first_not_of, and find_last_not_of.

Slide 42

Slide 42 text

前置き 前置き 探索系のメンバ関数には4つのオーバーロードがあるが うち3つはstring_viewを加⼯、またはポインタからstring_viewを構築し 1つ⽬を呼び出しているだけ

Slide 43

Slide 43 text

前置き 前置き は と等しい constexprreturn-typeF(constcharT*s,size_typepos); returnF(basic_string_view(s),pos);

Slide 44

Slide 44 text

前置き 前置き は と等しい constexprreturn-typeF(constcharT*s,size_typepos,size_typen); F(basic_string_view(s,n),pos);

Slide 45

Slide 45 text

前置き 前置き は と等しい constexprreturn-typeF(charTc,size_typepos); returnF(basic_string_view(&c,1),pos);

Slide 46

Slide 46 text

find find 指定した位置posから、呼び出しもとの参照する⽂字列に含まれる部分⽂字列svが 最初に現れる位置を検索し、戻り値とする ⾒つからなければbasic_string_view::npos rfind rfind 指定した位置posから、呼び出しもとの参照する⽂字列に含まれる部分⽂字列svが 最後に現れる位置を検索し、戻り値とする ⾒つからなければbasic_string_view::npos constexprsize_typefind(basic_string_viewsv,size_typepos=0)constnoexcept; constexprsize_typerfind(basic_string_views,size_typepos=npos)constnoexcept;

Slide 47

Slide 47 text

find_first_of find_first_of 指定した位置posから、⽂字列sv内のいずれかの⽂字が 最初に現れる位置を検索し、戻り値とする ⾒つからなければbasic_string_view::npos find_last_of find_last_of 指定した位置posから、⽂字列sv内のいずれかの⽂字が 最後に現れる位置を検索し、戻り値とする ⾒つからなければbasic_string_view::npos constexprsize_typefind_first_of(basic_string_viewsv,size_typepos=0)constnoexcept constexprsize_typefind_last_of(basic_string_viewsv,size_typepos=npos)constnoexce

Slide 48

Slide 48 text

find_first_not_of find_first_not_of 指定した位置posから、⽂字列sv内のいずれの⽂字にも⼀致しない 最初に現れる位置を検索し、戻り値とする ⾒つからなければbasic_string_view::npos find_last_not_of find_last_not_of 指定した位置posから、⽂字列sv内のいずれの⽂字にも⼀致しない 最後に現れる位置を検索し、戻り値とする ⾒つからなければbasic_string_view::npos constexprsize_typefind_first_not_of(basic_string_viewsv, size_typepos=0)constnoexcept; constexprsize_typefind_last_not_of(basic_string_viewsv, size_typepos=0)constnoexcept;

Slide 49

Slide 49 text

⾮メンバ関数(関係演算⼦) ⾮メンバ関数(関係演算⼦) 全部basic_string_view::compareを呼び出して 戻り値が正か負かゼロかを⾒ているだけ

Slide 50

Slide 50 text

operator== operator== 戻り値:lhs.compare(rhs)==0. template constexprbooloperator==(basic_string_viewlhs, basic_string_viewrhs)noexcept;

Slide 51

Slide 51 text

operator!= operator!= 戻り値:lhs.compare(rhs)!=0. template constexprbooloperator!=(basic_string_viewlhs, basic_string_viewrhs)noexcept;

Slide 52

Slide 52 text

operator< operator< 戻り値:lhs.compare(rhs)<0. template constexprbooloperator<(basic_string_viewlhs, basic_string_viewrhs)noexcept;

Slide 53

Slide 53 text

operator> operator> 戻り値:lhs.compare(rhs)>0. template constexprbooloperator>(basic_string_viewlhs, basic_string_viewrhs)noexcept;

Slide 54

Slide 54 text

operator<= operator<= 戻り値:lhs.compare(rhs)<=0. template constexprbooloperator<=(basic_string_viewlhs, basic_string_viewrhs)noexcept;

Slide 55

Slide 55 text

operator>= operator>= 戻り値:lhs.compare(rhs)>=0. template constexprbooloperator>=(basic_string_viewlhs, basic_string_viewrhs)noexcept;

Slide 56

Slide 56 text

operator<< (出⼒⽤) operator<< (出⼒⽤) template basic_ostream& operator<<(basic_ostream&os,basic_string_viewstr);

Slide 57

Slide 57 text

おわり おわり