最終更新日時: 2026年01月07日 22時31分19秒 (JST)
Akira Takahashi が更新

履歴 編集

class template
<string>

# std::basic_string

    namespace std {
      template <class charT,
                class traits = char_traits<charT>,
                class Allocator = allocator<charT> >
      class basic_string;

      using string    = basic_string<char>;
      using u8string  = basic_string<char8_t>;   // C++20から
      using u16string = basic_string<char16_t>;  // C++11から
      using u32string = basic_string<char32_t>;  // C++11から
      using wstring   = basic_string<wchar_t>;

      namespace pmr {  // C++17から
        template <class charT, class traits = char_traits<charT>>
          using basic_string =
            std::basic_string<charT, traits, polymorphic_allocator<charT>>;

        using string    = basic_string<char>;
        using u8string  = basic_string<char8_t>; // C++20から
        using u16string = basic_string<char16_t>;
        using u32string = basic_string<char32_t>;
        using wstring   = basic_string<wchar_t>;
      }
    }

## 概要

`basic_string`クラスは、あらゆる文字型を使用できる文字列クラスである。
テンプレートパラメータとして文字型を受け取るようになっており、使用を容易にするため、以下のパラメータ設定済みエイリアスが定義されている。

エイリアス | 説明 | 対応バージョン
--- | --- | ---
`string` | `char`型文字列。ASCII、UTF-8等のマルチバイト文字列や、バイト配列として使用する。 |
`wstring` | `wchar_t`型文字列。`wchar_t`が16ビットの環境で、UTF-16の文字列として使用する。 |
`u8string` | `char8_t`型文字列。UTF-8の文字列として使用する。 | C++20
`u16string` | `char16_t`型文字列。UTF-16の文字列として使用する。 | C++11
`u32string` | `char32_t`型文字列。UTF-32の文字列として使用する。 | C++11
`pmr::string` | 多相アロケータを用いる`string` | C++17
`pmr::wstring` | 多相アロケータを用いる`wstring` | C++17
`pmr::u8string` | 多相アロケータを用いる`u8string` | C++20
`pmr::u16string` | 多相アロケータを用いる`u16string` | C++17
`pmr::u32string` | 多相アロケータを用いる`u32string` | C++17

`basic_string`文字列オブジェクトに含まれる各要素は、必ずしも1文字を表すわけではないことに注意が必要である。
このクラスが表すのは、文字型`charT`の動的配列であり、文字の動的配列ではない。
したがって、文字列中に以下のようなものが含まれている場合、`basic_string`クラスにおいては複数の要素と見なされる。

- マルチバイト文字（`charT`が`char`などの場合）
- サロゲートペア
- 結合文字列
- 異体字切り換えシーケンス (IVS)

## メンバ関数

### 構築・破棄

名前 | 説明 | 対応バージョン
--- | --- | ---
`(constructor)` | コンストラクタ |
`(destructor)` | デストラクタ |
`operator=` | 代入演算子 |

### イテレータ

名前 | 説明 | 対応バージョン
--- | --- | ---
`begin` | 先頭の要素を指すイテレータを取得する |
`end` | 末尾の次を指すイテレータを取得する |
`cbegin` | 先頭の要素を指す読み取り専用イテレータを取得する | C++11
`cend` | 末尾の次を指す読み取り専用イテレータを取得する | C++11
`rbegin` | 末尾を指す逆イテレータを取得する |
`rend` | 先頭の前を指す逆イテレータを取得する |
`crbegin` | 末尾を指す読み取り専用逆イテレータを取得する | C++11
`crend` | 先頭の前を指す読み取り専用逆イテレータを取得する | C++11

### 領域

名前 | 説明 | 対応バージョン
--- | --- | ---
`size` | 文字列の長さを取得する |
`length` | 文字列の長さを取得する |
`max_size` | 格納可能な最大の文字列長を取得する |
`resize` | 文字列の長さを変更する |
`resize_and_overwrite` | 文字列の長さの変更と併せて任意の初期化を行う | C++23
`capacity` | メモリを再確保せずに格納できる最大の要素数を取得する |
`reserve` | `capacity`を変更する |
`shrink_to_fit` | `capacity`を`size`まで縮小する | C++11
`clear` | 文字列をクリアする |
`empty` | 文字列が空かどうかを判定する |

### 要素アクセス

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator[]` | 任意の位置の要素を取得する |
`at` | 任意の位置の要素を取得する |
`front` | 先頭要素を取得する | C++11
`back` | 末尾要素を取得する | C++11

### 文字列の変更

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+=` | 文字／文字列を追加する |
`append` | 文字／文字列を追加する |
`push_back` | 末尾に要素を追加する |
`append_range` | Rangeの要素を末尾へ追加する | C++23
`assign` | 文字列の再代入 |
`assign_range` | Rangeの要素を再代入 | C++23
`insert` | 文字／文字列を挿入する |
`insert_range` | Rangeの要素を挿入する | C++23
`erase` | 要素を削除する |
`pop_back` | 末尾の1要素を削除する | C++11
`replace` | 文字列の一部を置換する |
`swap` | 他の`basic_string`オブジェクトとデータを入れ替える |

### 文字列の操作

名前 | 説明 | 対応バージョン
--- | --- | ---
`c_str` | C言語の文字列表現を取得する |
`data` | 文字配列表現を取得する |
`operator basic_string_view` | `std::basic_string_view`型に変換する | C++17
`get_allocator` | アロケータを取得する |
`copy` | 他の文字列にコピーする |
`find` | 指定文字列を検索する |
`rfind` | 最後に現れる指定文字列を検索する |
`find_first_of` | 最初に現れる指定文字を検索する |
`find_last_of` | 最後に現れる指定文字を検索する |
`find_first_not_of` | 先頭から、指定文字が見つからない位置を検索する |
`find_last_not_of` | 末尾から、指定文字が見つからない位置を検索する |
`substr` | 部分文字列を取得する |
`subview` | 部分文字列の`std::basic_string_view`を構築する | C++26
`compare` | 他の文字列との比較を行う |
`starts_with` | 指定の文字列で始まるかを判定する | C++20
`ends_with` | 指定の文字列で終わるかを判定する | C++20
`contains` | 指定の文字・文字列が含まれているかを判定する | C++23

### メンバ定数

名前 | 説明 | 対応バージョン
--- | --- | ---
`npos` | 無効な位置を表す。`find`や`substr`などで使われる。 `static const size_type npos = -1;` | C++23からconstexpr

### メンバ型

名前 | 説明 | 対応バージョン
--- | --- | ---
`traits_type` | 文字特性型 `traits` |
`value_type` | 文字型 `traits::char_type` |
`allocator_type` | アロケータ型 `Allocator` |
`size_type` | 要素数を表す符号なし整数型。 `allocator_traits<Allocator>::size_type` |
`difference_type` | イテレータの差を表す符号付き整数型。 `allocator_traits<Allocator>::difference_type` |
`reference` | 参照型 `value_type&` |
`const_reference` | `const`参照型 `const value&` |
`pointer` | ポインタ型 `allocator_traits<Allocator>::pointer` |
`const_pointer` | `const`ポインタ型 `allocator_traits<Allocator>::const_pointer` |
`iterator` | イテレータ |
`const_iterator` | 読み取り専用イテレータ |
`reverse_iterator` | 逆順イテレータ `reverse_iterator<iterator>` |
`const_reverse_iterator` | 読み取り専用逆イテレータ `reverse_iterator<const_iterator>` |

## 非メンバ関数

### 文字列連結

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator+` | 文字列の連結 |

### 比較演算子

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator==` | 等値比較 |
`operator!=` | 非等値比較 |
`operator<=>` | 三方比較 | C++20
`operator<` | 左辺が右辺より小さいかの判定を行う |
`operator<=` | 左辺が右辺以下かの判定を行う |
`operator>` | 左辺が右辺より大きいかの判定を行う |
`operator>=` | 左辺が右辺以上かの判定を行う |

### 入出力

名前 | 説明 | 対応バージョン
--- | --- | ---
`operator<<` | ストリームへの出力 |
`operator>>` | ストリームからの入力 |
`getline` | 入力ストリームから1行読み込む |

### 入れ替え

名前 | 説明 | 対応バージョン
--- | --- | ---
`swap` | 2つの`basic_string`オブジェクトを入れ替える |

### 要素削除

名前 | 説明 | 対応バージョン
--- | --- | ---
`erase` | 指定した値をもつ要素とその分の領域を、コンテナから削除する | C++20
`erase_if` | 指定した条件に合致する要素とその分の領域を、コンテナから削除する | C++20

### リテラル

名前 | 説明 | 対応バージョン
--- | --- | ---
`s` | `basic_string`のリテラル | C++14

## 推論補助

名前 | 説明 | 対応バージョン
--- | --- | ---
`(deduction_guide)` | クラステンプレートの推論補助 | C++17

## 例

### 基本的な使い方 (C++03)

    #include <iostream>
    #include <cstdio>
    #include <string>

    int main()
    {
      // C文字列からstringオブジェクトを構築
      std::string s = "hello";

      // 末尾に文字列を追加
      s += " world";

      // 部分文字列を取得(始点:0、始点からの文字数:5)
      std::string hello = s.substr(0, 5);

      // ostreamへの出力
      std::cout << hello << std::endl;

      // C文字列を取得し、const char*を要求するAPIに渡す
      std::printf("%s", s.c_str());
    }

#### 出力

    hello
    hello world

### 定数式内でbasic_stringを使用する (C++20)

    #include <cassert>
    #include <string>

    constexpr bool f()
    {
      std::string s = "Hello";
      s += " World";

      auto* p = s.data();
      assert(p);

      return true;
    }

    int main()
    {
      static_assert(f());
    }

## 参照

- N2668 Concurrency Modifications to Basic String
  - C++11で、`basic_string`の仕様が、並行実行のパフォーマンスを考慮したものに変更された経緯の提案文書
- P0254R2 Integrating `std::string_view` and `std::string`