【初心者向け】C++の「Strings」で文字列の長さを操作!std::basic_string::resizeの使い方を徹底解説
void resize(size_type n);
void resize(size_type n, charT c);
引数
c
(オプション): 文字列末尾に挿入する文字。デフォルトでは、何も挿入されません。n
: 新しい文字列の長さを指定する整数型の値。
戻り値
なし
例外
n
がmax_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
と他の代替方法をベンチマークテストして、比較検討する必要があります。