C++ の std::list と例

std::list とは何ですか?

C++ では、std::list はストレージ コンテナーを指します。 std:list を使用すると、どこからでも項目を挿入および削除できます。 std::list は二重リンクリストとして実装されます。 これは、リスト データに双方向かつ順次アクセスできることを意味します。

標準テンプレート ライブラリ リストは高速ランダム アクセスをサポートしていませんが、全方向からの順次アクセスをサポートしています。

リスト要素を異なるメモリ チャンクに分散させることができます。 データへの順次アクセスに必要な情報はコンテナに保存されます。 std::list は、実行時に必要に応じて両端から拡張および縮小できます。 内部アロケータはストレージ要件を自動的に満たします。

なぜ std::list を使用するのでしょうか?

std::List を使用する理由は次のとおりです。

  • std::list は、配列やベクトルなどの他のシーケンス コンテナーと比較して優れています。
  • 任意の位置から要素を挿入、移動、抽出する際のパフォーマンスが向上します。
  • std::list も、 algorithms そのようなことを実行する opera集中的に取り組みます。

リスト構文

std::list を定義するには、 ヘッダファイル。 std::list 定義構文は次のとおりです。

template < class Type, class Alloc =allocator<T> > class list;

上記のパラメータの説明は次のとおりです。

  • T – 含まれる要素のタイプを定義します。T は、ユーザー定義タイプを含む任意のデータタイプで置き換えることができます。
  • Alloc – アロケータ オブジェクトのタイプを定義します。これは、デフォルトでアロケータ クラス テンプレートを使用します。 これは値に依存しており、単純なメモリ割り当てモデルを使用します。

例1

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };

	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

出力:

std::リスト

コードのスクリーンショットは次のとおりです。

std::リスト

コードの説明:

  1. その関数を使用するには、アルゴリズム ヘッダー ファイルをインクルードします。
  2. その機能を使用するには、iostream ヘッダー ファイルをインクルードします。
  3. その機能を使用するには、リスト ヘッダー ファイルをインクルードします。
  4. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。
  5. 4 つの整数のセットを含む my_list という名前のリストを作成します。
  6. for ループを使用してループ変数 x を作成します。 この変数は、リスト要素を反復処理するために使用されます。
  7. リストの値をコンソールに出力します。
  8. 本体の端 forループ.
  9. main() 関数の本体の終わり。

C++ リスト関数

一般的な std::list 関数は次のとおりです。

演算 説明
インサート() この関数は、イテレータが指す位置の前に新しい項目を挿入します。
プッシュバック() この関数は、リストの最後に新しい項目を追加します。
プッシュ_フロント() リストの先頭に新しい項目を追加します。
ポップフロント() リストの最初の項目を削除します。
サイズ() この関数はリスト要素の数を決定します。
フロント() リストの最初の項目を決定します。
戻る() リストの最後の項目を決定します。
逆行する () リスト項目を反転します。
マージ() XNUMX つのソートされたリストをマージします。

コンストラクター

ここには 機能 によって提供されるヘッダーファイル:

  • デフォルトのコンストラクター std::list::list() - 要素がゼロの空のリストを作成します。
  • Fill コンストラクター std::list::list() - n 個の要素を含むリストを作成し、各要素に値ゼロ (0) を割り当てます。
  • 範囲コンストラクター std::list::list() - 最初から最後までの範囲に多くの要素を含むリストを作成します。
  • コピー コンストラクター std::list::list() - 既存のリストに含まれる各要素のコピーを含むリストを作成します。
  • 移動コンストラクター std::list::list() - 移動セマンティクスを使用して、別のリストの要素を含むリストを作成します。
  • 初期化リスト コンストラクター std::list::list() - 移動セマンティクスを使用して、別のリストの要素を含むリストを作成します。

#include <iostream>
#include <list>
using namespace std;
int main(void) {
	list<int> l;
	list<int> l1 = { 10, 20, 30 };
	list<int> l2(l1.begin(), l1.end());
	list<int> l3(move(l1));  
	cout << "Size of list l: " << l.size() << endl;
	cout << "List l2 contents: " << endl;
	for (auto it = l2.begin(); it != l2.end(); ++it)
	      cout << *it << endl;
	cout << "List l3 contents: " << endl;
	for (auto it = l3.begin(); it != l3.end(); ++it)
		cout << *it << endl;
	return 0;
}

出力:

リストコンストラクター

コードのスクリーンショットは次のとおりです。

リストコンストラクター

コードの説明:

  1. その機能を使用するには、iostream ヘッダー ファイルをインクルードします。
  2. その機能を使用するには、リスト ヘッダー ファイルをインクルードします。
  3. std 名前空間を呼び出さずにそのクラスを使用するには、コードに std 名前空間を含めます。
  4. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。
  5. l という名前の空のリストを作成します。
  6. 1 つの整数のセットを含む l3 という名前のリストを作成します。
  7. l2 という名前のリスト内の最初から最後までのすべての要素を含む l1 という名前のリストを作成します。
  8. 移動セマンティクスを使用して l3 という名前のリストを作成します。 リスト l3 はリスト l2 と同じ内容になります。
  9. l という名前のリストのサイズを他のテキストと一緒にコンソールに表示します。
  10. コンソールにテキストを出力します。
  11. it という名前の反復子を作成し、それを使用して l2 という名前のリストの要素を反復処理します。
  12. l2 という名前のリストの要素をコンソールに出力します。
  13. コンソールにテキストを出力します。
  14. it という名前の反復子を作成し、それを使用して l3 という名前のリストの要素を反復処理します。
  15. l3 という名前のリストの要素をコンソールに出力します。
  16. プログラムは正常に完了すると値を返す必要があります。
  17. main() 関数の本体の終わり。

コンテナのプロパティ

コンテナーのプロパティのリストは次のとおりです。

プロパティ 説明
シーケンス シーケンス コンテナーは、要素を厳密な線形シーケンスで順序付けします。 要素はシーケンス内の位置によってアクセスされます。
二重リンクリスト すべての要素には、前後の要素を見つける方法に関する情報が含まれています。これにより、挿入と削除に一定の時間がかかります。 operaション。
アロケータ対応 アロケータ オブジェクトは、ストレージ サイズを動的に変更するために使用されます。

リストへの挿入

リストに値を挿入するために使用できるさまざまな関数があります。 これを実証してみましょう:

#include <algorithm>
#include <iostream>
#include <list>
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	my_list.push_front(11);
	my_list.push_back(18);
	auto it = std::find(my_list.begin(), my_list.end(), 10);
	if (it != my_list.end()) {
		my_list.insert(it, 21);
	}
	for (int x : my_list) {
		std::cout << x << '\n';
	}
}

出力:

リストへの挿入

コードのスクリーンショットは次のとおりです。

リストへの挿入

コードの説明:

  1. その関数を使用するには、アルゴリズム ヘッダー ファイルをインクルードします。
  2. その機能を使用するには、iostream ヘッダー ファイルをインクルードします。
  3. その機能を使用するには、リスト ヘッダー ファイルをインクルードします。
  4. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。
  5. 4 つの整数のセットを含む my_list という名前のリストを作成します。
  6. 要素 11 を my_list という名前のリストの先頭に挿入します。
  7. 要素 18 を my_list という名前のリストの最後に挿入します。
  8. イテレータを作成し、それを使用してリスト my_list から要素 10 を検索します。
  9. if ステートメントを使用して、上記の要素が見つかったかどうかを判断します。
  10. 要素 21 が見つかった場合は、その要素の前に要素 XNUMX を挿入します。
  11. if ステートメントの本文の終わり。
  12. for ループを使用してループ変数 x を作成します。 この変数は、リスト要素を反復処理するために使用されます。
  13. リストの値をコンソールに出力します。
  14. for a ループの本体の終わり。
  15. main() 関数の本体の終わり。

リストから削除する

リストから項目を削除することができます。 Erase() 関数を使用すると、リストから項目または項目の範囲を削除できます。

  • 単一の項目を削除するには、整数の位置を XNUMX つ渡すだけです。 項目は削除されます。
  • 範囲を削除するには、開始反復子と終了反復子を渡します。 これを実証してみましょう。

#include <algorithm>
#include <iostream>
#include <list>
using namespace std;
int main() {
	std::list<int> my_list = { 12, 5, 10, 9 };
	cout << "List elements before deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	list<int>::iterator i = my_list.begin();
	my_list.erase(i);
	cout << "\nList elements after deletion: ";
	for (int x : my_list) {
		std::cout << x << '\n';
	}
	return 0;
}

出力:

リストから削除する

コードのスクリーンショットは次のとおりです。

リストから削除する

コードの説明:

  1. その関数を使用するには、アルゴリズム ヘッダー ファイルをインクルードします。
  2. その機能を使用するには、iostream ヘッダー ファイルをインクルードします。
  3. その機能を使用するには、リスト ヘッダー ファイルをインクルードします。
  4. プログラムに std 名前空間を含めると、そのクラスを呼び出さずに使用できます。
  5. main() 関数を呼び出します。 プログラム ロジックは、この関数の本体内に追加する必要があります。
  6. 4 つの整数のセットを含む my_list という名前のリストを作成します。
  7. コンソールにテキストを出力します。
  8. for ループを使用してループ変数 x を作成します。 この変数は、リスト要素を反復処理するために使用されます。
  9. リストの値をコンソールに出力します。
  10. for ループの本体の終わり。
  11. リストの最初の要素を指す反復子 i を作成します。
  12. イテレータ i が指す Erase() 関数を使用します。
  13. コンソールにテキストを出力します。
  14. for ループを使用してループ変数 x を作成します。 この変数は、リスト要素を反復処理するために使用されます。
  15. リストの値をコンソールに出力します。 これは削除後に表示されます。
  16. for ループの本体の終わり。
  17. プログラムは正常に完了すると値を返す必要があります。
  18. main() 関数の本体の終わり。

まとめ

  • std::list はストレージ コンテナーです。
  • どこからでも一定時間に項目の挿入と削除が可能です。
  • 二重リンクとして実装されています
  • std::list データには、双方向かつ順次にアクセスできます。
  • std::list は高速ランダム アクセスをサポートしていません。 ただし、全方向からの順次アクセスをサポートします。
  • std::list のリスト要素を異なるメモリ チャンクに分散させることができます。
  • 実行時に必要に応じて、std::list を両端から縮小または拡張できます。
  • 項目を std::list に挿入するには、insert() 関数を使用します。
  • std::list から項目を削除するには、erase() 関数を使用します。