【C++】std::stringオブジェクトを構築(生成・初期化)する様々な方法

目次

はじめに

C++のstd::stringは、文字列を柔軟に扱うための非常に強力なクラスです。その柔軟性は、オブジェクトを生成する際の豊富なコンストラクタに支えられています。

空の文字列として生成するだけでなく、C言語スタイルの文字列リテラルから、あるいは他のstringオブジェクトのコピーとして、さらにはコンテナの一部分から、といった多様な方法でstringオブジェクトを初期化できます。

この記事では、std::stringを構築するための主要なコンストラクタのパターンを、サンプルコードと共に網羅的に解説します。


stringの構築サンプルコード

このコードは、7つの異なる方法でstd::stringオブジェクトを生成し、それぞれの結果を出力します。

完成コード

#include <iostream>
#include <string>
#include <vector>
#include <string_view> // C++17

using namespace std;

int main() {
    // (a) デフォルトコンストラクタ (空の文字列)
    string str_a;

    // (b) 文字列リテラルから
    string str_b = "Hello";

    // (c) 同じ文字を繰り返して
    string str_c(5, '#'); // '#'を5回繰り返す

    // (d) 他のstringからコピー
    string str_d = str_b;

    // (e) 他のstringからムーブ (C++11)
    string temp_str = "World";
    string str_e = move(temp_str);
    
    // (f) イテレータの範囲から
    vector<char> char_vec = {'C', '+', '+'};
    string str_f(char_vec.begin(), char_vec.end());
    
    // (g) string_viewから (C++17)
    string_view sv = "from string_view";
    string str_g(sv);

    cout << "a (デフォルト): " << "\"" << str_a << "\"" << endl;
    cout << "b (リテラル): " << str_b << endl;
    cout << "c (繰り返し): " << str_c << endl;
    cout << "d (コピー): " << str_d << endl;
    cout << "e (ムーブ): " << str_e << endl;
    cout << "f (範囲から): " << str_f << endl;
    cout << "g (string_viewから): " << str_g << endl;

    return 0;
}

各構築方法の解説

  • (a) デフォルトコンストラクタ: string str_a; 引数なしで宣言すると、空の文字列(長さが0)が生成されます。
  • (b) 文字列リテラルから: string str_b = "Hello"; C言語スタイルの文字列リテラル(const char*)から直接stringを初期化できます。最も一般的な使い方の一つです。
  • (c) 文字の繰り返し: string str_c(5, '#'); 第1引数で指定した回数だけ、第2引数の文字を繰り返した文字列を生成します。
  • (d) コピーコンストラクタ: string str_d = str_b; 既存のstringオブジェクトを元に、全く同じ内容を持つ新しいstringオブジェクトを生成します。
  • (e) ムーブコンストラクタ: string str_e = move(temp_str); C++11以降で利用可能です。temp_str の内容(内部のメモリ領域)の所有権を、新しいstr_eに効率的に移動させます。元のtemp_strは空の状態になります。コピーよりも高速です。
  • (f) 範囲コンストラクタ: string str_f(char_vec.begin(), char_vec.end()); vectorなどのコンテナの開始イテレータと終了イテレータを指定することで、その範囲の要素から文字列を構築します。
  • (g) string_viewから: string str_g(sv); C++17以降で利用可能です。string_viewオブジェクトからstringを生成します。

まとめ

今回は、C++のstd::stringオブジェクトを生成・初期化するための様々な方法を解説しました。これらの豊富なコンストラクタを使い分けることで、あらゆる状況に応じて、効率的かつ直感的に文字列オブジェクトを準備することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次