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