std::basic_string
| ヘッダ <string>
|
||
template<
class CharT,
class Traits = std::char_traits<CharT>,
class Allocator = std::allocator<CharT>
> class basic_string;
|
で定義 (1) | |
namespace pmr {
template<
class CharT,
class Traits = std::char_traits<CharT>
> using basic_string =
std::basic_string<CharT, Traits, std::pmr::polymorphic_allocator<CharT>>;
}
|
(2) | (C++17 以上) |
クラステンプレート basic_string は、文字のようなオブジェクトのシーケンスを格納および操作します。それらのオブジェクトは、TrivialType かつ StandardLayoutType である非配列オブジェクトです。このクラスは、文字型にもその型に対する操作の性質にも依存しません。操作の定義は、Traits テンプレートパラメータ(std::char_traits の特殊化または互換性のあるトレイトクラス)を介して提供されます。
basic_string の要素は連続して格納されます。つまり、basic_string s に対して、&*(s.begin() + n) == &*s.begin() + n 内の任意の n について [0, s.size()) が成り立ち、*(s.begin() + s.size()) の値は CharT()(ヌル終端文字)となります(C++11 以上); または同等に、s[0] へのポインタは、配列(C++11 未満)ヌル終端配列(C++11 以上) の最初の要素へのポインタを期待する関数に渡すことができます。
CharT
std::basic_string は、AllocatorAwareContainer(カスタマイズされた construct/destroy が要素の構築/破棄に使用されないことを除く)、SequenceContainer、および ContiguousContainer(C++17 以上) の要件を満たします。
もし Traits::char_type と Allocator::char_type のいずれかが CharT と異なる場合、プログラムは ill-formed となります。
|
しかし、通常 |
(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) |
文字列が指定された接頭辞で始まるか調べる (パブリックメンバ関数) |
(C++20) |
文字列が指定された接尾辞で終わるか調べる (パブリックメンバ関数) |
(C++23) |
文字列が指定された部分文字列または文字を含むか調べる (パブリックメンバ関数) |
| 部分文字列を返す (パブリックメンバ関数) | |
(C++26) |
部分ビューを返す (パブリックメンバ関数) |
非メンバー関数
|
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++文字列処理 |