C ++の標準テンプレートライブラリのビギナーズガイド

C ++は、初心者として遭遇する可能性のある最も強力で威圧的なプログラミング言語の1つです。理由は非常に簡単です。目的の出力を実現するには、多くのコードが必要です。標準テンプレートライブラリ(STL)は、この難問を解決するのに役立ちます。

STLは、並べ替えや検索などの機能のコードを作成する際に費やされる時間と労力を考慮すると、1行のコードでこれらすべての操作を実行するのに役立ちます。このライブラリは、問題解決や技術面接の準備に非常に役立ちます。

標準テンプレートライブラリとは何ですか?

標準テンプレートライブラリ(STL)は、ビルド済みの関数とコンテナで構成されるC ++ライブラリです。これには、ベクトル、スタック、キューなどの一般的なデータ構造用のいくつかの著名なテンプレートクラスと、プログラミングを容易にするためのバイナリ検索などの便利なアルゴリズム関数が含まれています。

C ++の標準テンプレートライブラリは、次の4つのコンポーネントで構成されています。

  1. アルゴリズム
  2. コンテナ
  3. 関数
  4. イテレータ

STLの最も一般的に使用されるコンポーネントであるため、アルゴリズムとコンテナーをさらに詳しく見ていきましょう。

STLのアルゴリズム

<algorithm>ヘッダーファイルはSTLの一部であり、手動でコーディングする代わりに使用できるいくつかのアルゴリズム関数で構成されています。含まれているアルゴリズムのいくつかは、二分探索、ソート、および逆であり、これらは非常に便利です。

まず、C ++ファイルに<algorithm>ヘッダーをインポートする必要があります。構文は次のとおりです。

 #include <algorithm>

今後のメソッドについては、例として{6、2、9、1、4}の値を持つ配列変数を検討してください。

 int arr[] = {6, 2, 9, 1, 4};

ソート()

sort()関数は、指定されたデータ構造内のすべての要素を昇順で並べ替えるのに役立ちます。この関数は、開始イテレーターと終了イテレーターの2つのパラメーターを取ります。

関連:マージソートアルゴリズムの概要

構文:

 sort(start_iterator, end_iterator);

簡単な例を次に示します。

 sort(arr, arr+5);
for (int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

出力:

 1 2 4 6 9

逆行する()

reverse()関数は、指定されたデータ構造内の要素の順序を逆にします。開始イテレータと終了イテレータの2つのパラメータを受け入れます。

構文:

 reverse(start_iterator, end_iterator);

上記の方法の簡単な例を次に示します。

 reverse(arr, arr+5);
for(int i = 0; i < 5; i++) {
cout << arr[i] << " ";
}

出力:

 4 1 9 2 6

* min_element()および* max_element()

関数* max_element()および* min_element()は、それぞれ、指定されたデータ構造内の最大値と最小値を返します。これらの関数は両方とも、開始イテレータと終了イテレータの2つの引数を受け入れます。

構文:

 *max_element(start_iterator, end_iterator);
*min_element(start_iterator, end_iterator);

例の配列でこれらの関数を呼び出すと、これらの関数がどのような値を返すかを調べてみましょう。

 cout << *max_element(arr, arr+5) << endl;
cout << *min_element(arr, arr+5) << endl;

出力:

 9
1

binary_search()メソッドは、指定された値がデータ構造内に存在するかどうかを見つけるために使用されます。開始イテレータ、終了イテレータ、および検索する値の3つの引数を受け入れます。

二分探索は、ソートされたデータ構造でのみ機能します。したがって、 binary_search()メソッドの前に最初にsort()メソッドを呼び出す必要があります。

構文:

 binary_search(start_iterator, end_iterator, value_to_find)

この方法のデモンストレーションは次のとおりです。

 sort(arr, arr+5);
binary_search(arr, arr+5, 2) ? cout << "Element found" : cout << "Element not found";
binary_search(arr, arr+5, 7) ? cout << "Element found" : cout << "Element not found";

出力:

 Element found
Element not found

カウント()

count()メソッドは、データ構造内で指定された値の出現回数を返します。開始イテレータ、終了イテレータ、およびカウントする値の3つの引数を取ります。

構文:

 count(start_iterator, end_iterator, value_to_count);

この方法の例を次に示します。

 cout << count(arr, arr+5, 2) << endl;

出力:

 1

STLのコンテナ

コンテナは、オブジェクトとデータを格納するデータ構造です。ベクトル、リスト、スタック、キュー、セット、およびマップは、指定されたプリミティブデータ型に従ってデータを格納する例の一部です。これらのコンテナは、C ++ファイルにそれぞれのヘッダーをインポートすることで使用できます。

コンテナ変数を初期化するときに、 <>角かっこ内にintcharstringなどのプリミティブデータを記載する必要があります。

これらのコンテナのいくつかをさらに詳しく調べてみましょう。

ベクター

ベクトルは、サイズ変更可能で柔軟性のある動的配列です。ベクトルから要素を挿入または削除すると、ベクトルのサイズが自動的に調整されます。これは、JavaのArrayListデータ構造に似ています。

構文:

 #include <vector>
vector<data_type> variable_name;

ここにいくつかの重要なベクトルメソッドがあります:

  1. push_back(value) :このメソッドは、データをベクトルに追加します。
  2. pop_back() :このメソッドは、ベクトルから最後の要素を削除します。
  3. insert(index、value) :このメソッドは、指定された位置の要素の前に新しい要素を挿入します。
  4. size() :このメソッドは、ベクトルのサイズを返します。
  5. empty() :このメソッドは、ベクトルが空かどうかをチェックします。
  6. front() :このメソッドは、ベクトルの最初の値を返します。
  7. back() :backメソッドは、ベクトルの最後の値を返します。
  8. at(index) :このメソッドは、指定された位置の値を返します。
  9. initialize(index) :eraseメソッドは、指定されたインデックスから要素を削除します。
  10. clear() :このメソッドは、ベクター内のすべてのアイテムをクリアします。
 vector < int > v = { 23, 12, 56, 10 };
v.push_back(5);
v.push_back(25);
v.pop_back();
auto i = v.insert(v.begin() + 1, 7);
cout << "The size of the given vector " << v.size() << endl;
if (v.empty()) {
cout << "Vector is empty" << endl;
} else {
cout << "Vector is not empty" << endl;
}
cout << "Element at the first position is " << v.front() << endl;
cout << "Element at the last position is " << v.back() << endl;
cout << "Element at the given position is " << v.at(4) << endl;
v.erase(v.begin() + 1);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}

出力:

 The size of the given vector 6
Vector is not empty
Element at the first position is 23
Element at the last position is 5
Element at the given position is 10
23 12 56 10 5

キュー

キューのデータ構造では、要素は後ろから挿入され、前から削除されます。したがって、FIFO(「先入れ先出し」)アプローチに従います。

構文:

 #include <queue>
queue<data_type> variable_name;

重要なキューメソッドは次のとおりです。

  1. push(value ):このメソッドは要素をキューに追加します。
  2. pop() :このメソッドは、キューの最初の要素を削除します。
  3. size() :このメソッドはキューのサイズを返します。
  4. front() :このメソッドは、キューの最初の要素を返します。
  5. back() :このメソッドは、キューの最後の要素を返します。
 queue < int > q;
q.push(30);
q.push(40);
q.push(50);
q.push(60);
q.push(70);
cout << "The first element is " << q.front() << endl;
cout << "The last element is " << q.back() << endl;
cout << "The size of queue is " << q.size() << endl;
q.pop();
cout << "Printing all the elements of the Queue" << endl;
while (!q.empty()) {
cout << q.front() << " ";
q.pop();
}

出力:

 The first element is 30
The last element is 70
The size of the queue is 5
Printing all the elements of the Queue
40 50 60 70

スタック

スタックコンテナはLIFO法で動作します。 LIFOは「後入れ先出し」の略です。データは同じ端からプッシュおよびポップされます。

構文:

 #include <stack>
stack<data_type> variable_name;

重要なスタックメソッドは次のとおりです。

  1. push(value ):このメソッドは、スタック内の要素をプッシュします。
  2. pop() :このメソッドは、スタックの最上位要素を削除します。
  3. top() :このメソッドは、スタックに入力された最後の要素の値を返します。
  4. size() :このメソッドはスタックのサイズを返します。
  5. empty() :このメソッドは、スタックが空かどうかをチェックします。
 stack < int > s;
s.push(30);
s.push(40);
s.push(50);
s.push(60);
cout << "The top of the stack contains " << s.top() << endl;
s.pop();
cout << "The top of the stack after performing pop operation: " << s.top() << endl;
cout << "Printing all elements of the stack" << endl;
while (!s.empty()) {
cout << s.top() << " ";
s.pop();
}

出力:

 The top of the stack contains 60
The top of the stack after performing pop operation: 50
Printing all elements of the stack
50 40 30

セットする

セットコンテナは一意の値を保持するために使用され、要素の値は、セットに挿入されると変更できません。セット内のすべての要素は、ソートされた方法で格納されます。セットコンテナは、Pythonのセットデータ構造に似ています

構文:

 #include <set>
set<data_type> variable_name;

重要なsetメソッドは次のとおりです。

  1. insert(value) :このメソッドは、セットに要素を挿入します。
  2. begin() :このメソッドは、イテレータをセットの最初の要素に戻します。
  3. end() :このメソッドは、イテレータをセットの最後の要素に戻します。
  4. size() :このメソッドはセットのサイズを返します。
  5. empty() :このメソッドは、セットが空かどうかをチェックします。
  6. find(value) :このメソッドは、パラメーターで渡された要素にイテレーターを返します。要素が見つからない場合、この関数はイテレータをセットの最後に戻します。
  7. erge(value) :このメソッドは、指定された要素をセットから削除しました。
 set < int > s;
s.insert(20);
s.insert(30);
s.insert(40);
s.insert(50);
s.insert(60);
s.insert(60);
s.insert(60);
auto i = s.begin();
cout << "Element at the first position " << * i << endl;
cout << "The size of the set " << s.size() << endl;
s.find(20) != s.end() ? cout << "Element found" << endl : cout << "Element not found" << endl;
s.erase(30);
cout << "Printing all the elements" << endl;
for (auto i = s.begin(); i != s.end(); i++) {
cout << * i << " ";
}

出力:

 Element at the first position 20
The size of the set 5
Element found
Printing all the elements
20 40 50 60

C ++は難しい必要はありません

他のすべてのスキルと同様に、STLを最大限に活用するには練習が不可欠です。これらのコンテナとアルゴリズムは、多くの時間を節約し、使いやすいものにするのに役立ちます。上記の例を実践することから始めれば、最終的には自分のプロジェクトでも使用できるようになります。

ただし、C ++を初めて学習する場合は、STLの理解に進む前に、基本を学ぶことから始めてください。