• Class / Function / Type

      std::
    • Header file

      <>
    • Other / All

    最終更新日時(UTC):
    が更新

    履歴 編集

    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クラスにおいては複数の要素と見なされる。

    • マルチバイト文字(charTcharなどの場合)
    • サロゲートペア
    • 結合文字列
    • 異体字切り換えシーケンス (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 capacitysizeまで縮小する 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 部分文字列を取得する
    compare 他の文字列との比較を行う
    starts_with 指定の文字列で始まるかを判定する C++20
    ends_with 指定の文字列で終わるかを判定する C++20
    contains 指定の文字・文字列が含まれているかを判定する C++23

    メンバ定数

    名前 説明 対応バージョン
    npos 無効な位置を表す。findsubstrなどで使われる。
    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());
    }
    

    参照