GeezerVison is showing cpprefjp.github.io — std::basic_string::substr - cpprefjp C++日本語リファレンス
最終更新日時:
2026年10月03日 22時31分04秒 (JST)
Akira Takahashi
が更新
履歴
編集
function
<string>
std:: basic_string:: substr
basic_string
substr ( size_type pos = 0 ,
size_type n = npos ) const ; // (1) C++98
constexpr basic_string
substr ( size_type pos = 0 ,
size_type n = npos ) const ; // (1) C++20
constexpr basic_string
substr ( size_type pos = 0 ,
size_type n = npos ) const & ; // (1) C++23
constexpr basic_string
substr ( size_type pos = 0 ,
size_type n = npos ) && ; // (2) C++23
概要
部分文字列を取得する。
pos番目からn要素の文字列を返す。
引数省略時は、先頭位置(0番目)から全要素(npos)の文字列を返す。
要件
pos <= size()
戻り値(C++20まで)
nとsize() - posのうち、小さい方をコピーする長さrlenとして、
basic_string(data() +pos, rlen)
を返す。パラメータnのデフォルト引数であるnposの場合には、pos番目以降の全体を返す。
効果(C++23から)
例外
pos > size() の場合、out_of_range 例外を送出する。
備考
C++23から(2)右辺値修飾オーバーロード の追加にともない、従来からある(1)はconst左辺値参照オーバーロードに変更される。
同時にメンバ関数substrのライブラリ仕様記述は、新たに追加されたbasic_stringコンストラクタを用いて書き直される。その後でも基本的な動作はC++20までと同一であるが、(2)のオーバーロードでは右辺値のstd::stringからの部分文字列切り出しが効率化(余計なコピー/アロケーションの削減)される。
例
出力
llo
llo
C++23の右辺値参照修飾オーバーロード追加後の変更例
#include <iostream>
#include <string>
// 右辺値stringを返す関数
auto f () -> std::string ;
int main ()
{
std::string s = "some long string that forces allocation" ;
// sから部分文字列のstringをコピーして作成、sは変更されない(この振る舞いは変わらない)
std::string result1 = s . substr ( 5 , 4 );
// C++20 : 一時オブジェクトのstringから部分文字列のstringをコピーして作成
// C++23 : 一時オブジェクトのstringのリソースを再利用して部分文字列を保持するstringオブジェクトを作成
std::string result2 = f (). substr ( 5 , 4 );
// C++20 : 一時オブジェクトのstringから部分文字列のstringをコピーして作成
// C++23 : 一時オブジェクトのstringのリソースを再利用して部分文字列を保持するstringオブジェクトを作成
std::string result3 = std::string ( "hello" ). substr ( 5 , 4 );
// C++20 : sから部分文字列のstringをコピーして作成、sは変更されない
// C++23 : sのリソースを再利用して部分文字列を保持するstringオブジェクトを作成、sは有効だが未規定な状態となる(C++23における動作変更)
std::string result4 = std :: move ( s ). substr ( 5 , 4 );
}
参照