C++の標準ライブラリ「std::basic_string::assign」を徹底解説!文字列操作をマスターしよう!
文字列の割り当て
最も基本的な使用方法として、std::basic_string::assign
は、別の std::basic_string
オブジェクトの内容を割り当てることができます。
std::string str1 = "Hello";
std::string str2 = "World";
str1.assign(str2);
std::cout << str1 << std::endl; // Output: World
この例では、str1
に str2
の内容である "World" が割り当てられます。
部分文字列の割り当て
std::basic_string::assign
は、別の std::basic_string
オブジェクトの一部を割り当てることもできます。
std::string str1 = "Hello, World!";
std::string str2 = str1.substr(7, 5); // "World"
str1.assign(str2, 1, 3); // "orl"
std::cout << str1 << std::endl; // Output: orl
C文字列の割り当て
std::basic_string::assign
は、C文字列 (char array) の内容を割り当てることもできます。
char cstr[] = "Hello, World!";
std::string str1;
str1.assign(cstr);
std::cout << str1 << std::endl; // Output: Hello, World!
この例では、str1
に cstr
の内容である "Hello, World!" が割り当てられます。
文字の繰り返し割り当て
std::basic_string::assign
は、指定した文字を繰り返し割り当てることもできます。
std::string str1;
str1.assign(5, '*');
std::cout << str1 << std::endl; // Output: *****
この例では、str1
に '*' 文字が 5 回繰り返し割り当てられます。
関数詳細
std::basic_string::assign
関数は、以下の引数を受け取ることができます。
c
: 繰り返し割り当てる文字 (デフォルトは '\0')len
: コピーする文字数 (デフォルトはstr
の長さ)pos
: 文字列str
からコピーを開始する位置 (デフォルトは 0)str
: 文字列の内容を表すstd::basic_string
オブジェクト
戻り値
std::basic_string::assign
関数は、参照している std::basic_string
オブジェクト自身を返します。
例
以下の例は、std::basic_string::assign
関数の様々な使用方法を示しています。
// 文字列の割り当て
std::string str1 = "Hello";
std::string str2 = "World";
str1.assign(str2);
std::cout << str1 << std::endl; // Output: World
// 部分文字列の割り当て
std::string str3 = "Hello, World!";
std::string str4 = str3.substr(7, 5); // "World"
str1.assign(str4, 1, 3);
std::cout << str1 << std::endl; // Output: orl
// C文字列の割り当て
char cstr[] = "Hello, World!";
std::string str5;
str5.assign(cstr);
std::cout << str5 << std::endl; // Output: Hello, World!
// 文字の繰り返し割り当て
std::string str6;
str6.assign(5, '*');
std::cout << str6 << std::endl; // Output: *****
文字列の割り当て
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello";
std::string str2 = "World";
str1.assign(str2);
std::cout << str1 << std::endl; // Output: World
return 0;
}
このコードは、以下の動作を行います。
std::string
オブジェクトstr1
とstr2
を作成します。str1
にstr2
の内容を割り当てます。str1
の内容を出力します。
部分文字列の割り当て
#include <iostream>
#include <string>
int main() {
std::string str1 = "Hello, World!";
std::string str2 = str1.substr(7, 5); // "World"
str1.assign(str2, 1, 3);
std::cout << str1 << std::endl; // Output: orl
return 0;
}
std::string
オブジェクトstr1
とstr2
を作成します。str2
にstr1
の一部である "World" を割り当てます。str1
にstr2
の一部である "orl" を割り当てます。str1
の内容を出力します。
C文字列の割り当て
#include <iostream>
#include <string>
int main() {
char cstr[] = "Hello, World!";
std::string str1;
str1.assign(cstr);
std::cout << str1 << std::endl; // Output: Hello, World!
return 0;
}
- C文字列
cstr
とstd::string
オブジェクトstr1
を作成します。 str1
にcstr
の内容を割り当てます。str1
の内容を出力します。
文字の繰り返し割り当て
#include <iostream>
#include <string>
int main() {
std::string str1;
str1.assign(5, '*');
std::cout << str1 << std::endl; // Output: *****
return 0;
}
std::string
オブジェクトstr1
を作成します。str1
に '*' 文字を 5 回繰り返し割り当てます。str1
の内容を出力します。
- コードは、わかりやすさのために簡潔化されています。実際のアプリケーションでは、より複雑なロジックが必要になる場合があります。
- 各コード例は、コメントを使用して説明されています。
- 上記のコードは、コンパイルと実行に必要なヘッダーファイル
#include <iostream>
と#include <string>
を含んでいます。
コンストラクタの使用
新しい文字列を作成したい場合は、std::string
コンストラクタを使用するのが簡潔で効率的な方法です。コンストラクタには、様々な引数を受け取るオーバーロード形式が用意されています。
std::string str1 = "Hello"; // 初期値を指定したコンストラクタ
std::string str2(str1); // コピーコンストラクタ
std::string str3(5, '*'); // 文字の繰り返し割り当てコンストラクタ
利点
- 効率的なメモリ管理
- 簡潔で読みやすいコード
欠点
std::basic_string::assign
のすべての機能をサポートしていない
イテレータを使用したループ
文字列の内容を要素ごとに操作したい場合は、イテレータを使用したループが有効です。
std::string str1;
for (char& c : str1) {
c = '*';
}
利点
- 柔軟性が高い
- 個々の文字にアクセスして操作できる
欠点
std::basic_string::assign
よりも冗長
アルゴリズムの使用
特定の操作を実行したい場合は、C++ 標準ライブラリに用意されているアルゴリズムを使用することができます。例えば、以下のコードは、すべての文字を '*' に置き換えます。
std::string str1 = "Hello";
std::fill(str1.begin(), str1.end(), '*');
利点
- コードが簡潔になる場合がある
- 汎用的なアルゴリズムを使用できる
欠点
- 常に適切なアルゴリズムが存在するとは限らない
特別なライブラリの使用
高度な文字列操作が必要な場合は、Boost.String など、C++ 向けのサードパーティ製ライブラリを使用することができます。これらのライブラリは、std::basic_string::assign
よりも強力な機能を提供することがあります。
利点
- 既存のコードを再利用できる場合がある
- 高度な文字列操作機能
欠点
- 標準ライブラリよりもパフォーマンスが劣る場合がある
- ライブラリの学習と導入が必要
選択の指針
どの方法を選択するかは、状況によって異なります。以下の要素を考慮する必要があります。
- 既存のライブラリの利用可能性
- コードの可読性
- パフォーマンス要件
- 操作の複雑さ