【初心者向け】C++の「Strings」で文字列の長さを操作!std::basic_string::resizeの使い方を徹底解説


void resize(size_type n);
void resize(size_type n, charT c);

引数

  • c (オプション): 文字列末尾に挿入する文字。デフォルトでは、何も挿入されません。
  • n: 新しい文字列の長さを指定する整数型の値。

戻り値

なし

例外

  • nmax_size() より大きい場合、length_error 例外がスローされます。

動作

  • n が現在の文字列の長さよりも大きい場合、c で初期化された n - size() 個の文字が末尾に追加されます。
  • n が現在の文字列の長さよりも小さい場合、末尾の size() - n 個の文字が削除されます。
#include <iostream>
#include <string>

int main() {
  std::string str = "Hello, World!";

  // 文字列の長さを 5 文字に短縮
  str.resize(5);
  std::cout << str << std::endl; // 出力: Hello

  // 文字列の長さを 10 文字に拡張し、末尾に '*' を追加
  str.resize(10, '*');
  std::cout << str << std::endl; // 出力: Hello***

  return 0;
}
  • std::string::reserve 関数と組み合わせて使用することで、メモリ割り当ての効率を向上させることができます。
  • std::string::resize は、文字列の長さを変更するだけでなく、文字列の内容を初期化するためにも使用できます。


文字列の長さを短縮する

#include <iostream>
#include <string>

int main() {
  std::string str = "This is a long string.";

  // 文字列の長さを 10 文字に短縮
  str.resize(10);
  std::cout << str << std::endl; // 出力: This is a

  return 0;
}

文字列の長さを拡張し、末尾に文字を追加する

#include <iostream>
#include <string>

int main() {
  std::string str = "Hello";

  // 文字列の長さを 15 文字に拡張し、末尾に '*' を 5 個追加
  str.resize(15, '*');
  std::cout << str << std::endl; // 出力: Hello*****

  return 0;
}

文字列の長さを拡張し、デフォルトの初期化を行う

#include <iostream>
#include <string>

int main() {
  std::string str;

  // 文字列の長さを 10 文字に拡張
  str.resize(10);
  std::cout << str << std::endl; // 出力: 10 個の空白文字

  return 0;
}

std::string::reserve と組み合わせてメモリ割り当てを効率化する

#include <iostream>
#include <string>

int main() {
  std::string str;

  // メモリ容量を 100 文字確保
  str.reserve(100);

  // 文字列の長さを 20 文字に拡張
  str.resize(20);

  // 実際に使用されているメモリ容量は 20 文字のみ
  std::cout << "使用メモリ容量: " << str.capacity() << std::endl; // 出力: 使用メモリ容量: 100

  return 0;
}

文字列型 std::wstring を使用する

#include <iostream>
#include <string>

int main() {
  std::wstring str = L"This is a wide string.";

  // 文字列の長さを 5 文字に短縮
  str.resize(5);
  std::wcout << str << std::endl; // 出力: This is a

  return 0;
}

これらの例は、std::basic_string::resize 関数の基本的な使用方法を示しています。この関数は、様々な状況で文字列を操作する際に役立ちます。

  • 複雑な文字列操作を行う場合は、他の C++ 標準ライブラリの関数やアルゴリズムを使用することもできます。


std::string::assign を使用する

std::string::assign 関数は、文字列を別の文字列または文字列リテラルに置き換えるために使用できます。文字列の長さを変更するだけでなく、内容も変更したい場合は、この方法が適しています。

#include <iostream>
#include <string>

int main() {
  std::string str = "Hello, World!";

  // 文字列を "Hello" に置き換える
  str.assign("Hello");
  std::cout << str << std::endl; // 出力: Hello

  return 0;
}

利点

  • 文字列の内容を簡単に変更できる。

欠点

  • std::basic_string::resize よりも非効率的な場合がある。

std::string::erase と std::string::insert を組み合わせて使用する

std::string::erase 関数は、文字列の一部を削除するために使用できます。一方、std::string::insert 関数は、文字列の一部に文字列または文字列リテラルを挿入するために使用できます。これらの関数を組み合わせて、文字列の長さを変更することができます。

#include <iostream>
#include <string>

int main() {
  std::string str = "Hello, World!";

  // 末尾の 6 文字を削除
  str.erase(str.size() - 6);
  std::cout << str << std::endl; // 出力: Hello

  // 末尾に '*' を 3 個挿入
  str.insert(str.size(), "***");
  std::cout << str << std::endl; // 出力: Hello***

  return 0;
}

利点

  • 柔軟性が高い。

欠点

  • 複数の操作を組み合わせるため、エラーが発生しやすい。
  • std::basic_string::resize よりもコードが冗長になる。

イテレータを使用して手動で操作する

C++ イテレータを使用して、文字列の要素を個別に操作することもできます。この方法は、高度な制御が必要な場合や、パフォーマンスが重要な場合に適しています。

#include <iostream>
#include <string>
#include <iterator>

int main() {
  std::string str = "Hello, World!";

  // 末尾の 6 文字を削除
  std::string::iterator it = str.begin() + str.size() - 6;
  str.erase(it, str.end());
  std::cout << str << std::endl; // 出力: Hello

  // 末尾に '*' を 3 個挿入
  it = str.end();
  for (int i = 0; i < 3; ++i) {
    *it++ = '*';
  }
  std::cout << str << std::endl; // 出力: Hello***

  return 0;
}

利点

  • 非常に柔軟性が高く、パフォーマンスに優れている。

欠点

  • イテレータに関する深い理解が必要。
  • コードが複雑になり、エラーが発生しやすい。

サードライブラリのライブラリを使用する

Boost.String など、C++ 用の文字列操作に特化したサードライブラリもいくつか存在します。これらのライブラリは、std::basic_string::resize の代替となる高機能な関数を提供している場合があります。

利点

  • 標準ライブラリよりも高機能な関数を提供している場合がある。

欠点

  • 標準ライブラリの関数よりも習得コストが高い。
  • 別途ライブラリを導入する必要がある。

std::basic_string::resize は、C++ の文字列の長さを変更するための汎用的な関数ですが、状況によっては代替方法の方が適切な場合があります。上記で紹介した代替方法の利点と欠点を考慮し、それぞれの状況に合った方法を選択してください。

  • コードの簡潔性: コードの
  • 性能: 性能が重要な場合は、std::basic_string::resize と他の代替方法をベンチマークテストして、比較検討する必要があります。