記事ディレクトリ
3. 文字列クラスオブジェクトのアクセスおよびトラバース操作
1. string クラスを学ぶ理由
1.C言語の文字列
C 言語では、文字列は \0 で終わる文字の集合です。操作の便宜上、C ライブラリには str 系のライブラリ関数がいくつか用意されていますが、これらのライブラリ関数は文字列から分離されており、 の考え方には準拠していません。 oop. 、その下にあるスペースはユーザーが管理する必要があるため、注意しないと範囲外にアクセスしてしまう可能性があります。
2. 標準ライブラリの文字列クラス
1.文字列クラス
文字列クラスを使用する場合は、#include ヘッダー ファイルをインクルードし、名前空間 std を使用する必要があります。
1. string クラスは、文字列を表す string クラスです。
2. このクラスのインターフェースは基本的に通常のコンテナのインターフェースと同じですが、文字列操作に特化した通常の操作がいくつか追加されています。
3. string の最下層は実際には次のようになります: Basic_string テンプレート クラスのエイリアス
4. マルチバイトまたは可変長の文字シーケンスは操作できません。
2.文字列クラスの共通インターフェース
1. 文字列クラスオブジェクトの一般的な構造
関数名 | 機能の説明 |
弦() | パラメータなしの構築。空の文字列クラス オブジェクト、つまり空の文字列を構築します。 |
文字列(const char *s) | c-string を使用して文字列クラス オブジェクトを構築する |
文字列(定数文字列) | 文字列クラスを渡して構築をコピーします |
文字列(size_t n,char c) | 文字列クラス オブジェクトには n 個の文字が含まれています。 c |
説明書:
string s1; //构造一个空的string类对象s1
string s2("hello string"); // 用c字符串构造string类对象s2
string s3(s2) //拷贝构造s3
2. 文字列クラスオブジェクトの容量操作
関数名 | 機能の説明 |
サイズ | 文字列の有効な文字長を返します。 |
長さ | サイズと同じ、文字列の有効な文字長を返します。 |
容量 | スペースの合計サイズを返します |
空の | 検出文字列が空の文字列として解放された場合は true を返し、それ以外の場合は false を返します。 |
クリア | 有効な文字を消去しますが、その下のスペースのサイズは変更しません |
予約する | 文字列用のスペースを確保する |
サイズ変更 | 有効な文字数を n に変更し、余分なスペースを文字 c で埋めます。 |
説明書:
void test()
{
string s("hello cplusplus");
cout<<s.size()<<endl;
cout<<s.capacity<<endl;
//将s中的字符串清空,清空只是将size清0,不改变底层空间的大小
s.clear();
//将s中的有效字符增加到20个,多出位置用'a'填充
s.resize(20,'a');
//将s中有效字符增加到15个,多出位置用缺省值\0填充
s.resize(15);
string s1;
s1.reserve(100);
}
- 予約を使用する場合: 拡張によるオーバーヘッドを回避するために、n 個のスペースを予約できます。予約パラメータが文字列の基になる領域の合計サイズより小さい場合、予約によって容量のサイズは変更されません。
3. 文字列クラスオブジェクトのアクセスおよびトラバース操作
関数名 | 機能の説明 |
オペレーター[] | const string クラス オブジェクトによって呼び出される、pos 位置の文字を返します。 |
開始+終了 | begin は文字のイテレータを取得します + end は最後の文字の次の位置のイテレータを取得します |
r開始+終了 | rbegin は最後の文字の次の位置への反復子を取得します + rend は最初の文字への反復子を取得します |
範囲用 | 糖衣構文の一種、C++11 の新しいトラバーサルメソッド |
説明書:
void test()
{
string s("hello cplusplus");
//1.for+operator[]
for(int i = 0; i<size;++i)
{
cout<<s[i]<<endl;
}
//2.迭代器 暂时可以将迭代器看成一个指针
string::iterator it = s.begin();
while(it!=s.end())
{
cout<<*it<<endl;
++it;
}
//反向迭代器rbegin
auto rit = s.rbegin();
while(rit!+s.rend())
{
cout<<*rit<<endl;
++rit;
}
//3.范围for 底层也是用的迭代器
for(auto ch:s)
{
cout<<ch<<end;
}
4. 文字列クラスオブジェクトの変更操作
関数名 | 機能の説明 |
押し戻す | 文字列の後に文字を追加します |
追加する | 文字列の後に文字列を追加します |
演算子+= | 文字列の後に文字列 str を追加します |
c str | C 形式の文字列を返します |
見つける+npos | 文字列内の pos 位置から始まる文字 c を検索し、文字列内の文字の位置を返します。npos は文字列内の静的メンバー変数であり、デフォルト値は -1 です。 |
探す | 文字列の pos 位置から始まる文字 c を検索し、文字列内の文字の位置を返します。 |
部分文字列 | str の pos 位置から開始して、n 文字をインターセプトして返します。 |
説明書:
void test()
{
string str("hello");
str.push_back(' '); //追加一个空格
str.append("world");
str +='b';
str += 'it';
//通过rfind获取file的后缀 从后往前找
string file("test.cpp");
size_t pos = file.rfind('.');
string suffix(file.substr(pos,file.size()-pos)); //获取后缀给suffix 获取子串,从pos位置向后找,找size-pos个长度
//取出url的域名
//协议+ 域名 + 资源
string url("http://www.cpluplus.com/reference/string/string/find/");
size_t start = url.find("://");
if(start == npos)
return ; //无效域名
start+= 3;
size_t finish = url.find('/',start);
string address = url.substr(start,finsh - start); //取出中间的子串
}
5.文字列クラスの非メンバ関数
関数 | 機能の説明 |
演算子+ | 値による戻り値を使用すると、ディープ コピーの効率が低下します |
オペレーター>> | 入力演算子のオーバーロード |
演算子<< | 出力演算子のオーバーロード |
ゲットライン | 文字列の行を取得します |
関係演算子 | サイズ比較 |
要約する
この章では主に string クラスと string クラスのいくつかのインターフェイス関数を紹介します。