Namespaces
Variants

std::basic_string

ja.cppreference.net より
 
 
 
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 となります。

std::basic_string のすべてのメンバ関数は constexpr です: 定数式の評価内で std::basic_string オブジェクトを作成および使用することが可能です。

しかし、通常 constexpr std::basic_string 変数を定義することはエラーです。なぜなら、定数評価では動的に確保されたストレージは同じ評価内で解放される必要があるためであり、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
Allocator::size_type (C++11以前)
std:: allocator_traits < Allocator > :: size_type (C++11以降)
difference_type
Allocator :: difference_type (C++11以前)
std:: allocator_traits < Allocator > :: difference_type (C++11以降)
reference value_type &
const_reference const value_type &
pointer

Allocator::pointer

(C++11以前)

std:: allocator_traits < Allocator > :: pointer

(C++11以降)
const_pointer

Allocator::const_pointer

(C++11以前)

std:: allocator_traits < Allocator > :: const_pointer

(C++11以降)
iterator

LegacyRandomAccessIterator および LegacyContiguousIterator で value_type を指すもの

(C++20以前)

LegacyRandomAccessIterator 、 contiguous_iterator 、および ConstexprIterator で value_type を指すもの

(C++20以降)
const_iterator

LegacyRandomAccessIterator および LegacyContiguousIterator で const value_type を指すもの

(C++20以前)

LegacyRandomAccessIterator 、 contiguous_iterator 、および ConstexprIterator で const value_type を指すもの

(C++20以降)
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)
文字列に値を代入する
(公開メンバ関数)
文字列に文字を割り当てる
(公開メンバ関数)
文字列に文字の範囲を割り当てる
(公開メンバ関数)
関連付けられたアロケータを返す
(公開メンバ関数)
要素アクセス
境界チェック付きで指定された文字にアクセスする
(公開メンバ関数)
指定された文字にアクセスする
(public member function)
( DR* )
最初の文字にアクセスする
(公開メンバ関数)
( DR* )
最後の文字にアクセスする
(公開メンバ関数)
文字列の最初の文字へのポインタを返す
(公開メンバ関数)
文字列の変更不可能な標準C文字配列バージョンを返す
(公開メンバ関数)
文字列全体に対する変更不可能な basic_string_view を返す
(公開メンバ関数)
イテレータ
先頭へのイテレータを返す
(公開メンバ関数)
(C++11)
終端へのイテレータを返す
(公開メンバ関数)
先頭への逆方向イテレータを返す
(公開メンバ関数)
(C++11)
末尾への逆方向イテレータを返す
(公開メンバ関数)
容量
文字列が空かどうかをチェックする
(public member function)
文字数を返す
(公開メンバー関数)
最大文字数を返す
(公開メンバ関数)
ストレージを予約
(公開メンバ関数)
現在割り当てられているストレージに保持可能な文字数を返す
(公開メンバ関数)
未使用のメモリを解放してメモリ使用量を削減します
(public member function)
修飾子
内容をクリアする
(公開メンバ関数)
文字列を挿入
(公開メンバ関数)
文字の範囲を挿入する
(公開メンバ関数)
文字を削除する
(公開メンバ関数)
末尾に文字を追加する
(公開メンバ関数)
( DR* )
最後の文字を削除する
(public member function)
末尾に文字を追加する
(公開メンバ関数)
文字の範囲を末尾に追加する
(公開メンバ関数)
末尾に文字を追加する
(公開メンバ関数)
文字列の指定された部分を置換する
(公開メンバ関数)
文字列の指定された部分を文字の範囲で置き換える
(公開メンバ関数)
文字列をコピー
(公開メンバ関数)
格納されている文字数を変更する
(公開メンバ関数)
格納されている文字数を変更し、ユーザー提供の操作を通じて不定内容を上書きする可能性がある
(公開メンバー関数)
内容を交換する
(公開メンバ関数)
検索
指定された部分文字列の最初の出現を検索します
(public member function)
部分文字列の最後の出現位置を検索
(公開メンバ関数)
文字の最初の出現を検索
(公開メンバ関数)
文字が存在しない最初の位置を検索
(公開メンバ関数)
文字の最後の出現を検索
(公開メンバー関数)
文字の不在を最後から検索
(公開メンバー関数)
操作
2つの文字列を比較する
(パブリックメンバ関数)
文字列が指定された接頭辞で始まるか調べる
(パブリックメンバ関数)
(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
文字配列リテラルを basic_string に変換する
(関数)

ヘルパークラス

文字列のハッシュサポート
(クラステンプレートの特殊化)

推論ガイド (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 と異なる場合、動作は未定義
この場合、プログラムは
不適格
  1. ↑ Traits::char_type のケースは P1148R0 で修正されました。

関連項目

読み取り専用文字列ビュー
(クラステンプレート)

外部リンク

C++文字列処理