目次
-
STLのstringクラス概要
-
主なAPIの解説 2.1 メンバ関数 2.1.1 コンストラクタ 2.1.2 代入演算子のオーバーロード 2.1.3 容量操作 2.1.4 要素アクセス 2.1.5 修飾操作 2.1.6 文字列操作 2.1.7 イテレータ 2.2 定数メンバ 2.3 非メンバ関数のオーバーロード 2.4 文字列から他の型への変換 2.5 他の型から文字列への変換
-
stringクラスの3つのトラバース方法
-
STLのstringクラス概要
- 文字列は文字の連続を表すクラスです。
- 標準的な文字列クラスは、このオブジェクトをサポートし、標準的な文字コンテナのインターフェースに似ていますが、シングルバイト文字列を操作するための専用機能が追加されています。
- stringクラスはcharをキャラクタータイプとして使用し、デフォルトのchar_traitsとアロケータータイプを採用しています(テンプレートの詳細はbasic_stringを参照)。
- stringクラスはbasic_stringテンプレートクラスのインスタンスであり、charでbasic_stringをインスタンス化し、char_traitsとアロケータをデフォルトパラメータとして使用しています。
- 文字エンコーディングに依存せずバイト単位で処理します。UTF-8などのマルチバイトや可変長文字列を扱う場合、すべてのメンバ関数やイテレータはバイト単位で動作します。
まとめ:
- stringクラスはchar型の順序付きリストとして実装された文字列クラスです。
- 通常コンテナのインターフェースに加え、文字列特有の操作が提供されています。
- 実装上はbasic_stringのエイリアスとして定義されています。
- マルチバイトや可変長文字列の処理には不向きです。 注意:stringクラスを使用する際は、#includeヘッダをインクルードし、std名前空間を使用する必要があります。
- 主なAPIの解説
2.1 メンバ関数
2.1.1 コンストラクタ
2.1.1.1 空文字列の生成
string()
2.1.1.2 Cスタイル文字列で初期化
string(const char s)*
2.1.1.3 n個の同一文字で初期化
string(size_t n, char c)
2.1.1.4 コピーコンストラクタ
string(const string& s)
2.1.1.5 文字列の一部で初期化(Cスタイルまたはstring)
string(const string& str, size_t pos, size_t len = npos) string(const char s, size_t n)*
2.1.2 代入演算子のオーバーロード
2.1.3 容量操作
2.1.3.1 有効長の取得
size_t size() const size_t length() const size()とlength()は同じ実装を持ち、他のコンテナとのインターフェース統一のためにsize()が採用されています。
注意:stringは'\0'で終端されない!!
2.1.3.2 容量の取得
size_t capacity() const stringはchar型の順序付きリストとして実装されているため、capacity()で容量を取得できます。
2.1.3.3 空文字列の判定
bool empty() const 空文字列の場合trueを返し、それ以外はfalseを返します。
2.1.3.4 文字列のクリア
void clear() 有効文字を削除しますが、容量は変更しません。
2.1.3.5 容量の拡張
void reserve(size_t n = 0)
2.1.3.6 有効長の変更
resize(size_t n) と resize(size_t n, char c) n未満の場合、余分な部分は'\0'または指定文字で埋められます。 容量変更は拡張時のみ発生します。
int main()
{
// 文字列長の変更例
string sampleStr = "なぜいつも変更されるのか?";
string anotherStr(sampleStr);
string thirdStr = anotherStr;
// 縮小
cout << "変更前:" << endl;
cout << "sampleStrの内容: " << sampleStr << endl;
cout << "sampleStrの長さ: " << sampleStr.size() << endl;
cout << "sampleStrの容量: " << sampleStr.capacity() << endl;
cout << endl;
sampleStr.resize(6);
cout << "変更後:" << endl;
cout << "sampleStrの内容: " << sampleStr << endl;
cout << "sampleStrの長さ: " << sampleStr.size() << endl;
cout << "sampleStrの容量: " << sampleStr.capacity() << endl;
cout << endl;
// 拡張
cout << "変更前:" << endl;
cout << "anotherStrの内容: " << "#" << anotherStr << "#" << endl;
cout << "anotherStrの長さ: " << anotherStr.size() << endl;
cout << "anotherStrの容量: " << anotherStr.capacity() << endl;
cout << endl;
// 文字指定なし
anotherStr.resize(32);
cout << "変更後:" << endl;
cout << "anotherStrの内容: " << "#" << anotherStr << "#" << endl;
cout << "anotherStrの長さ: " << anotherStr.size() << endl;
cout << "anotherStrの容量: " << anotherStr.capacity() << endl;
cout << endl;
cout << "変更前:" << endl;
cout << "thirdStrの内容: " << "#" << thirdStr << "#" << endl;
cout << "thirdStrの長さ: " << thirdStr.size() << endl;
cout << "thirdStrの容量: " << thirdStr.capacity() << endl;
cout << endl;
// 文字指定あり
thirdStr.resize(32, 'x');
cout << "変更後:" << endl;
cout << "thirdStrの内容: " << "#" << thirdStr << "#" << endl;
cout << "thirdStrの長さ: " << thirdStr.size() << endl;
cout << "thirdStrの容量: " << thirdStr.capacity() << endl;
cout << endl;
return 0;
}
2.1.3.7 最大長の取得
size_t max_size() const
2.1.4 要素アクセス
2.1.4.1 []演算子のオーバーロード
stringは順序付きリストで実装されているため、[]演算子で配列のようにアクセス可能です。戻り値は参照型なので値の変更が可能です。 注意:最初の要素は0から始まります。
2.1.5 修飾操作
2.1.5.1 文字列末尾への追加
void push_back(char c)
2.1.5.2 文字列末尾への文字列追加
2.1.5.3 +=演算子のオーバーロード
+=演算子は文字列または文字の追加に使用可能です。
2.1.5.4 任意位置への挿入
注意:pos == 0の場合は頭挿しで効率が悪い
2.1.5.5 任意位置からの削除
注意:pos == 0の場合は頭削除で効率が悪い
2.1.5.6 2つの文字列の交換
void swap(string& str)
2.1.5.7 文字列末尾からの削除
void pop_back()
2.1.6 文字列操作
2.1.6.1 Cスタイル文字列への変換
const char c_str() const* printfでstringを出力するにはCスタイル文字列への変換が必要です。 注意:変換時に自動的に'\0'が追加されます。
2.1.6.2 正方向での文字列検索
2.1.6.3 逆方向での文字列検索
2.1.6.4 子文字列の抽出
string substr(size_t pos = 0, size_t len = npos) const
2.1.6.5 Cスタイル配列へのコピー
size_t copy(char s, size_t len, size_t pos = 0) const* 注意:コピーされた文字列には'\0'が含まれないため、必要に応じて手動で追加する必要があります。
2.1.7 イテレータ
2.1.7.1 前進イテレータ
2.1.7.2 逆イテレータ
2.1.7.3 注意事項
注意:const修飾された文字列の場合、イテレータもconstでなければなりません。
2.1.7.4 イテレータの意義
イテレータはコンテナの要素に統一されたアクセス/変更方法を提供します。配列で実装されたコンテナ(stringやvector)ではインデックスアクセスが可能ですが、listやmapなどでは不可能です。イテレータはこうした場合にも汎用性を持ちます。 listの例: reverseアルゴリズムとの併用例:
2.2 定数メンバ
static const size_t npos = -1 nposはstringクラスの静的メンバ定数で、unsigned型として非常に大きな値を持つことに注意してください。
2.3 非メンバ関数のオーバーロード
2.3.1 +演算子のオーバーロード
+演算子は文字列の追加に使用可能ですが、戻り値が参照でないため効率が低く、+=を推奨します。
2.3.2 関係演算子のオーバーロード
比較はstrcmpと同様のルールで行われます。
2.3.3 流出力(<<)と流入力(>>)のオーバーロード
cout/cinでの直接入出力が可能です。 注意:cinは空白または改行で入力が終了します。
2.3.4 1行の文字列読み込み
getline関数はcinの制限を解決します。
2.4 文字列から他の型への変換
2.5 他の型から文字列への変換
- stringクラスの3つのトラバース方法
3.1 インデックスアクセス(内容変更可)
3.2 イテレータアクセス(内容変更可)
3.3 レンジベースのforループ
C++11で導入されたレンジベースforループは、配列やvector、listなどのシーケンス構造をトラバースするために使用されます。
// element_declaration: ループ変数の型と名前
// sequence: シーケンス構造(配列、vector、listなど)
for (element_declaration : sequence) {
// ループ体
}
レンジベースforループはシーケンスのイテレータを通じて要素をトラバースします。コンパイラがイテレータの初期化・インクリメント・終了を自動処理します。