記事ディレクトリ
STL の概要
STLとは何ですか?
STL は C++ 標準テンプレート ライブラリ (標準テンプレート ライブラリ) を指します。これは C++ の汎用ライブラリであり、ベクター、リスト、セット、マップ、ソート、検索など、一般的に使用される多くのデータ構造とアルゴリズムが含まれています。STL ライブラリの主な目的は、開発者が使いやすく、開発効率とコード品質を向上させる、効率的で信頼性の高い汎用のテンプレート クラスと関数のセットを提供することです。STL は C++ 標準ライブラリの重要な部分であり、C++ プログラミングに不可欠な部分です。
開発履歴とバージョン
STL (Standard Template Library) は、Alexander Stepanov と Meng Lee によって 1994 年に初めて提案されました。Alexander Stepanov は、Hewlett-Packard (HP) の研究者で、1983 年から 1994 年まで勤務し、STL の研究開発を開始しました。Meng Lee はスタンフォード大学の教授で、Alexander Stepanov の学生であり、STL の開発に参加しました。
1994 年に STL が初めて公開され、C++ 標準ライブラリに組み込まれました。1998 年に C++ 標準ライブラリが正式にリリースされ、STL が正式に組み込まれました。2000 年に、STL をさまざまなコンパイラやオペレーティング システムに移植し、互換性を維持することを目的とした STLport プロジェクトが開始されました。
C++ 標準の継続的な開発に伴い、STL の開発も絶えず進歩しています。C++11 では、STL に unowned_set、unowned_map、array などの新しい機能とデータ構造が導入されています。C++17 では、STL にも並列アルゴリズムなどのさらなる更新と改善が導入されています。
つまり、STL の開発は C++ 標準ライブラリの開発と切り離せないものなのです。C++ の継続的な開発に伴い、STL も継続的に改善および発展しています。
STL は多くのバージョンに分かれていますが、ここでは主に共通バージョン、つまりすべての STL の元祖であり、プログラム開発に大きく貢献したオリジナル バージョン (HP バージョン) を紹介します。PJ版、皆さんが使っているVSで使われているバージョンです。SGI バージョンは、Silicon Graphics Computer Systems, Inc. によって開発され、HP バージョンから継承されました。GCC (Linux) で採用されているため、移植性が高く、公開、改変、販売も可能で、命名スタイルやプログラミングスタイルの観点からも非常に読みやすいです。
STL 6 つの主要コンポーネント
STL の 6 つの主要コンポーネントは、コンテナー、アルゴリズム、イテレーター、ファンクター、空間コンフィギュレーター、アダプターです。これらについては、この研究の後半で詳しく紹介します。ここはわかりやすいですね。
文字列クラスについて理解する
オンライン ドキュメントの概要
string クラスを正式に導入する前に、C++ の学習に非常に役立つ 2 つのオンライン C++ ドキュメント クエリ Web サイトをお勧めします。公式と非公式。比較的簡潔で見つけやすいため、ここでは非公式のオンライン ドキュメントを使用することをお勧めします。もちろん、公式ドキュメントは非常に詳しく書かれており、どちらもそれぞれの利点があるため、好みに応じて選択できます。
文字列クラスの紹介
string は、文字列を処理するための C++ 標準ライブラリのクラスです。string クラスの本質は、文字列のシーケンス テーブルを管理することです。
以下は正式に string クラスの導入を開始します。
デフォルトのメンバー関数
文字列クラスのコンストラクター
string クラスは、合計 7 つのコンストラクターを提供します。これらは (1) 引数なしの構造です。(2) コピー構築。(3) 部分文字列の構築をコピーします。つまり、ソース文字列クラスの pos 位置から len 文字をコピーして構築します。(4) C 文字列を使用して構築します。C 文字列は、C 言語の文字配列の '\0' の終了識別子を参照します。 。(5) C 文字列内の n 文字を取得して構築します。(6) n 文字で構築します。(7) イテレータの範囲が初期化されますが、ここでは強調しません。イテレータについては後ほど説明します。
簡単に紹介します(3)
//substring (3)
string (const string& str, size_t pos, size_t len = npos);
ここでのデフォルト パラメーター npos は、実際には静的メンバー変数であり、4294967295 を示します。それは0xffffffffです。
実際には、ソース文字列クラスの pos 添字の文字から始まり、len 文字をコピーして構築します。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1("hello world");
string str2(str1, 6, 5);
string str3(str1,6);
cout << str2 << endl;
cout << str3 << endl;
return 0;
}
文字列のデストラクターと代入等号のオーバーロード
デストラクターと代入等号のオーバーロードは、単なる見た目を単純化したものです。デストラクターは、文字列クラスのインスタンス化されたオブジェクトのリソースをクリーンアップします。割り当て等号オーバーロードは、文字列クラスによってインスタンス化されたオブジェクトに値を割り当て、現在の値が置き換えられるようにします。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str1;
str1 = "abcde";
cout << str1 << endl;
str1 = 'c';
cout << str1 << endl;
return 0;
}
ストリーム挿入演算子のオーバーロードとストリーム抽出演算子のオーバーロード
int main()
{
string str1;
cin >> str1;
cout << str1 << endl;
return 0;
}
Push_backインターフェイスとappendインターフェイス
ここでのインターフェイスは、文字列クラスによってインスタンス化されたオブジェクトに文字または文字列を挿入するために使用されます。Push_back は、文字列クラス オブジェクトの後に文字を挿入します。append は、現在の文字列オブジェクトの後に文字、文字列、文字列オブジェクトなどを追加することです。
実際、ここでのインターフェイスは、上で説明したコンストラクターのオーバーロードされたパラメーターに似ています。append に対応するさまざまなパラメーターの機能は大まかに推測できます。ここでは紹介を繰り返しません。(2) インターフェイスについて話しましょう。 is append 文字列クラスオブジェクトの一部、つまり部分文字列。しかし、彼の 3 番目のパラメータにはデフォルトのパラメータが与えられておらず、実際には設計上の上記の構造とは少し異なります。これは文字列クラスの批判点でもあり、パラメータの設計が適切な連続性を持っていません。 。
int main()
{
string s1("hello");
cout << s1 << endl;
s1.push_back(' ');
s1.append("world");
cout << s1 << endl;
return 0;
}
プラス演算子のオーバーロードとプラス演算子のオーバーロード
add 演算子のオーバーロードと plus 演算子のオーバーロードでは、文字列クラス オブジェクトの末尾に文字または文字列を挿入します。+ 演算子は比較的まれに使用され、主に += 演算子が使用されます。加算演算子のオーバーロードはパブリック メンバー関数であり、文字列オブジェクトを文字および文字列に追加する操作をサポートするための加算演算子のオーバーロードは非メンバー関数です。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s1("hello world");
cout << s1 << endl;
string s2 = s1 + "你好";
cout << s2 << endl;
s2 = s2 + 'C';
cout << s2 << endl;
s2 = s2 + s2;
cout << s2 << endl;
return 0;
}
実際、+= 演算子のオーバーロードの基礎となる実装は、上記の 2 つのインターフェイスを再利用することであり、文字列クラス オブジェクトまたは文字列が後に続く += を呼び出すと、コンパイラは append を呼び出します。+= に続いて文字を呼び出すと、コンパイラは Push_back を呼び出します。使用の観点からは、+= 演算子を使用する方が快適です。
int main()
{
string s1("hello world");
cout << s1 << endl;
s1 += "你好";
cout << s1 << endl;
s1 += 'C';
cout << s1 << endl;
string s2("xxxxxxxxx");
s1 += s2;
cout << s1 << endl;
return 0;
}
文字列クラスが前に学習した C 文字列とは異なるのはなぜですか。オーバーフローを避けるためにサイズを自分で決定する必要があります。これは、文字列の基本的な実装がシーケンス テーブルのメカニズムに似ており、十分なスペースがない場合にスペースを自動的に拡張できるためです。