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

この例では、str1str2 の内容である "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!

この例では、str1cstr の内容である "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;
}

このコードは、以下の動作を行います。

  1. std::string オブジェクト str1str2 を作成します。
  2. str1str2 の内容を割り当てます。
  3. 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;
}
  1. std::string オブジェクト str1str2 を作成します。
  2. str2str1 の一部である "World" を割り当てます。
  3. str1str2 の一部である "orl" を割り当てます。
  4. 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;
}
  1. C文字列 cstrstd::string オブジェクト str1 を作成します。
  2. str1cstr の内容を割り当てます。
  3. str1 の内容を出力します。

文字の繰り返し割り当て

#include <iostream>
#include <string>

int main() {
  std::string str1;
  str1.assign(5, '*');

  std::cout << str1 << std::endl; // Output: *****

  return 0;
}
  1. std::string オブジェクト str1 を作成します。
  2. str1 に '*' 文字を 5 回繰り返し割り当てます。
  3. 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 よりも強力な機能を提供することがあります。

利点

  • 既存のコードを再利用できる場合がある
  • 高度な文字列操作機能

欠点

  • 標準ライブラリよりもパフォーマンスが劣る場合がある
  • ライブラリの学習と導入が必要

選択の指針

どの方法を選択するかは、状況によって異なります。以下の要素を考慮する必要があります。

  • 既存のライブラリの利用可能性
  • コードの可読性
  • パフォーマンス要件
  • 操作の複雑さ