std:: basic_string
|
ヘッダーで定義
<string>
|
||
|
template
<
class
CharT,
|
(1) | |
|
namespace
pmr
{
template
<
|
(2) | (C++17以降) |
クラステンプレート
basic_string
は、
文字
のようなオブジェクトのシーケンスを格納および操作します。これらのオブジェクトは、
TrivialType
および
StandardLayoutType
の非配列オブジェクトです。このクラスは、文字型にもその型に対する操作の性質にも依存しません。操作の定義は、
Traits
テンプレートパラメータを通じて提供されます - これは
std::char_traits
の特殊化、または互換性のある特性クラスです。
basic_string
の要素は連続して格納されます。つまり、任意の
basic_string
s
について、
&
*
(
s.
begin
(
)
+
n
)
==
&
*
s.
begin
(
)
+
n
が
[
0
,
s.
size
(
)
)
の範囲の任意の
n
に対して成り立ちます
。また、
*
(
s.
begin
(
)
+
s.
size
(
)
)
の値は
CharT
(
)
(ナルターミネータ)です
(C++11以降)
。言い換えれば、
s
[
0
]
へのポインタは、
配列の先頭要素を指すポインタを期待する関数
(C++11以前)
ナル終端配列の先頭要素を指すポインタを期待する関数
(C++11以降)
に渡すことができます。
std::basic_string
は、
AllocatorAwareContainer
の要件を満たします
(ただし、要素の構築/破棄にはカスタマイズされた
construct
/
destroy
は使用されません)。
SequenceContainer
および
ContiguousContainer
(C++17以降)
の要件も満たします。
Traits::char_type
と
Allocator::value_type
のいずれかが
CharT
と異なる場合、プログラムは不適格です。
std::basic_stringのすべてのメンバー関数は
std::basic_string
constexpr
です:定数式の評価において
std::basic_string
オブジェクトを作成および使用することが可能です。
ただし、
|
(C++20以降) |
一般的な文字型に対するいくつかのtypedefが提供されています:
|
定義済みヘッダー
<string>
|
|
| 型 | 定義 |
std::string
|
std :: basic_string < char > |
std::wstring
|
std :: basic_string < wchar_t > |
std::u8string
(C++20)
|
std :: basic_string < char8_t > |
std::u16string
(C++11)
|
std :: basic_string < char16_t > |
std::u32string
(C++11)
|
std :: basic_string < char32_t > |
std::pmr::string
(C++17)
|
std :: pmr :: basic_string < char > |
std::pmr::wstring
(C++17)
|
std :: pmr :: basic_string < wchar_t > |
std::pmr::u8string
(C++20)
|
std :: pmr :: basic_string < char8_t > |
std::pmr::u16string
(C++17)
|
std :: pmr :: basic_string < char16_t > |
std::pmr::u32string
(C++17)
|
std :: pmr :: basic_string < char32_t > |
目次 |
テンプレートパラメータ
| CharT | - | 文字型 |
| Traits | - | 文字型に対する操作を指定する特性クラス |
| Allocator | - | Allocator 内部ストレージの割り当てに使用されるアロケータ型 |
ネストされた型
| 型 | 定義 | ||||
traits_type
|
Traits
|
||||
value_type
|
CharT
|
||||
allocator_type
|
Allocator
|
||||
size_type
|
|
||||
difference_type
|
|
||||
reference
|
value_type & | ||||
const_reference
|
const value_type & | ||||
pointer
|
|
||||
const_pointer
|
|
||||
iterator
|
|
||||
const_iterator
|
|
||||
reverse_iterator
|
std:: reverse_iterator < iterator > | ||||
const_reverse_iterator
|
std:: reverse_iterator < const_iterator > |
データメンバ
constexpr
size_type
npos
[static]
|
特殊値 size_type ( - 1 ) 、その正確な意味は文脈に依存する |
メンバー関数
basic_string
を構築する
(公開メンバ関数) |
|
|
文字列を破棄し、使用されていた内部ストレージを解放する
(public member function) |
|
|
文字列に値を代入する
(公開メンバ関数) |
|
|
文字列に文字を割り当てる
(公開メンバ関数) |
|
|
(C++23)
|
文字列に文字の範囲を割り当てる
(公開メンバ関数) |
|
関連付けられたアロケータを返す
(公開メンバ関数) |
|
要素アクセス |
|
|
境界チェック付きで指定された文字にアクセスする
(公開メンバ関数) |
|
|
指定された文字にアクセスする
(public member function) |
|
|
(
DR*
)
|
最初の文字にアクセスする
(公開メンバ関数) |
|
(
DR*
)
|
最後の文字にアクセスする
(公開メンバ関数) |
|
文字列の最初の文字へのポインタを返す
(公開メンバ関数) |
|
|
文字列の変更不可能な標準C文字配列バージョンを返す
(公開メンバ関数) |
|
|
(C++17)
|
文字列全体に対する変更不可能な
basic_string_view
を返す
(公開メンバ関数) |
イテレータ |
|
|
(C++11)
|
先頭へのイテレータを返す
(公開メンバ関数) |
|
(C++11)
|
終端へのイテレータを返す
(公開メンバ関数) |
|
(C++11)
|
先頭への逆方向イテレータを返す
(公開メンバ関数) |
|
(C++11)
|
末尾への逆方向イテレータを返す
(公開メンバ関数) |
容量 |
|
|
文字列が空かどうかをチェックする
(public member function) |
|
|
文字数を返す
(公開メンバー関数) |
|
|
最大文字数を返す
(公開メンバ関数) |
|
|
ストレージを予約
(公開メンバ関数) |
|
|
現在割り当てられているストレージに保持可能な文字数を返す
(公開メンバ関数) |
|
|
(
DR*
)
|
未使用のメモリを解放してメモリ使用量を削減します
(public member function) |
修飾子 |
|
|
内容をクリアする
(公開メンバ関数) |
|
|
文字列を挿入
(公開メンバ関数) |
|
|
(C++23)
|
文字の範囲を挿入する
(公開メンバ関数) |
|
文字を削除する
(公開メンバ関数) |
|
|
末尾に文字を追加する
(公開メンバ関数) |
|
|
(
DR*
)
|
最後の文字を削除する
(public member function) |
|
末尾に文字を追加する
(公開メンバ関数) |
|
|
(C++23)
|
文字の範囲を末尾に追加する
(公開メンバ関数) |
|
末尾に文字を追加する
(公開メンバ関数) |
|
|
文字列の指定された部分を置換する
(公開メンバ関数) |
|
|
(C++23)
|
文字列の指定された部分を文字の範囲で置き換える
(公開メンバ関数) |
|
文字列をコピー
(公開メンバ関数) |
|
|
格納されている文字数を変更する
(公開メンバ関数) |
|
|
(C++23)
|
格納されている文字数を変更し、ユーザー提供の操作を通じて不定内容を上書きする可能性がある
(公開メンバー関数) |
|
内容を交換する
(公開メンバ関数) |
|
検索 |
|
|
指定された部分文字列の最初の出現を検索します
(public member function) |
|
|
部分文字列の最後の出現位置を検索
(公開メンバ関数) |
|
|
文字の最初の出現を検索
(公開メンバ関数) |
|
|
文字が存在しない最初の位置を検索
(公開メンバ関数) |
|
|
文字の最後の出現を検索
(公開メンバー関数) |
|
|
文字の不在を最後から検索
(公開メンバー関数) |
|
演算 |
|
|
2つの文字列を比較する
(公開メンバ関数) |
|
|
(C++20)
|
文字列が指定された接頭辞で始まるかどうかをチェックする
(public member function) |
|
(C++20)
|
文字列が指定された接尾辞で終わるかどうかをチェックします
(公開メンバ関数) |
|
(C++23)
|
文字列が指定された部分文字列または文字を含むかどうかをチェックする
(公開メンバ関数) |
|
部分文字列を返す
(公開メンバ関数) |
|
非メンバー関数
|
2つの文字列、文字列と
char
、または文字列と
string_view
を連結する
(関数テンプレート) |
|
|
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20で削除)
(C++20)
|
2つの文字列を辞書順で比較する
(関数テンプレート) |
|
std::swap
アルゴリズムを特殊化する
(関数テンプレート) |
|
|
特定の条件を満たすすべての要素を削除する
(関数テンプレート) |
|
入出力 |
|
|
文字列に対するストリーム入出力を実行する
(関数テンプレート) |
|
|
I/Oストリームから文字列にデータを読み込む
(関数テンプレート) |
|
数値変換 |
|
|
(C++11)
(C++11)
(C++11)
|
文字列を符号付き整数に変換する
(関数) |
|
(C++11)
(C++11)
|
文字列を符号なし整数に変換する
(関数) |
|
(C++11)
(C++11)
(C++11)
|
文字列を浮動小数点値に変換する
(関数) |
|
(C++11)
|
整数値または浮動小数点値を
string
に変換する
(関数) |
|
(C++11)
|
整数値または浮動小数点値を
wstring
に変換する
(関数) |
リテラル
|
インライン名前空間で定義
std::literals::string_literals
|
|
|
(C++14)
|
文字配列リテラルを
basic_string
に変換する
(関数) |
ヘルパークラス
|
(C++11)
|
文字列のハッシュサポート
(クラステンプレートの特殊化) |
推論ガイド (C++17以降)
イテレータの無効化
basic_string
の要素を参照する参照、ポインタ、およびイテレータは、
basic_string
への非const参照を引数に取る標準ライブラリ関数(例:
std::getline
、
std::swap
または
operator>>
)によって、および非constメンバ関数の呼び出しによって無効化される可能性があります。ただし、
operator[]
、
at
、
data
、
front
、
back
、
begin
、
rbegin
、
end
、および
rend
を除きます。
注記
C++23までは
std::basic_string
の要素を構築・破棄する際にカスタマイズされた
construct
または
destroy
を使用することが要求されていましたが、すべての実装はデフォルトのメカニズムのみを使用していました。この要求は
P1072R10
によって既存の実装に合わせて修正されました。
| 機能テスト マクロ | 値 | 標準 | 機能 |
|---|---|---|---|
__cpp_lib_string_udls
|
201304L
|
(C++14) | 文字列型のユーザー定義リテラル |
__cpp_lib_starts_ends_with
|
201711L
|
(C++20) |
starts_with
,
ends_with
|
__cpp_lib_constexpr_string
|
201907L
|
(C++20) |
std::basic_string
のconstexpr対応
|
__cpp_lib_char8_t
|
201907L
|
(C++20) |
std::u8string
|
__cpp_lib_erase_if
|
202002L
|
(C++20) |
erase
,
erase_if
|
__cpp_lib_string_contains
|
202011L
|
(C++23) |
contains
|
__cpp_lib_string_resize_and_overwrite
|
202110L
|
(C++23) |
resize_and_overwrite
|
__cpp_lib_containers_ranges
|
202202L
|
(C++23) | コンテナ互換範囲 を受け入れる構築、挿入、置換のメンバー関数 |
例
#include <iostream> #include <string> int main() { using namespace std::literals; // const char*からの文字列作成 std::string str1 = "hello"; // 文字列リテラルを使用した文字列作成 auto str2 = "world"s; // 文字列の連結 std::string str3 = str1 + " " + str2; // 結果の出力 std::cout << str3 << '\n'; std::string::size_type pos = str3.find(" "); str1 = str3.substr(pos + 1); // スペース以降の部分 str2 = str3.substr(0, pos); // スペースまでの部分 std::cout << str1 << ' ' << str2 << '\n'; // 添字演算子[]を使用した要素へのアクセス std::cout << str1[0] << '\n'; str1[0] = 'W'; std::cout << str1 << '\n'; }
出力:
hello world world hello w World
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 530 | C++98 |
basic_string
の要素のストレージの連続性が
LWG259 により誤って要求されなくなった |
再度要求する |
| LWG 2861 | C++98 |
value_type
は
Traits::char_type
であった
|
CharT
に変更
|
|
LWG 2994
( P1148R0 ) |
C++98 |
Traits::char_type
[1]
または
Allocator::char_type
のいずれかが
CharT
と異なる場合、動作は未定義
|
この場合、プログラムは
不適格 |
関連項目
|
(C++17)
|
読み取り専用文字列ビュー
(クラステンプレート) |
外部リンク
| C++文字列処理 |