目次
1. リストについて
リストは、文字列とベクトルと同様にコンテナであり、強い類似性を持っているため、文字列とベクトルを学習すると、リストも正確に使用できるようになります。
list は実際には主要な双方向循環リンク リストです
2. 関連機能の一覧表示
3. 関連機能の利用
リストの使用法は文字列やベクトルの使用法と似ていますが、理解しやすい簡単な例をいくつか示します。
1. コンストラクター
通常、最初の構築: パラメータなしの構築です。
2、プッシュバック
プッシュバックテールインサート
3. イテレータ
リストは文字列やベクトルとは異なります。連続した記憶領域がないため、[] を使用して走査することはできません。反復子を使用してのみ走査できます。
次のように:
もちろん、反復子をサポートしている場合は、range for もサポートされます。range for の最下層は反復子です。
前方反復子は上で説明されており、逆方向反復子も同じ方法で使用されます。
4、プッシュフロント
Push_front はヘッド挿入です (時間計算量は O(1))
5、ポップバック
Pop_back は末尾の削除です
元々は 4 3 2 1 でしたが、末尾を 2 回削除して 4 3 になりました。
6、挿入
insert はデータを挿入することです
1つ目は、posの位置にvalを挿入することです
2 つ目は、pos の位置に n 個の値を挿入することです。
3 番目の方法は、反復子の範囲を挿入することです。
また、挿入と消去は検索と組み合わせて使用されます。
また、vector と同様に、find はアルゴリズムのヘッダー ファイルに含まれていますが、find が見つからない場合は最後に返されるため、if 文を使用して見つかったかどうかを判断する必要があります。
つまり、以下に示すように、2 の前に 20 を挿入します。
7、消去
Eraseはデータを削除することです
また、erase が見つからなかった場合も最後に戻るので、insert と同様に if 文で判断する必要があります。
以下のように、2を削除します。
イテレータの失敗問題について
イテレータはポインタに似たもので、イテレータの失敗とは、対応するポインタが破壊されたにもかかわらず、破壊された領域がまだ使用されていることを意味します。
上記の挿入反復子と同様に、挿入は 2 より前の位置に挿入されるため、リンクされたリストにノードを追加するだけで、それらの関係は変更されず、ポインタが指す空間は破壊されないため、無効ではありません。
消去 2 の後、ノード 2 の位置は解放されたものの、ポインタはその位置を指したままであるため、イテレータの失敗の問題が発生しました。これを使用し続けると、次のようにプログラムがクラッシュします。
2 は pos 位置で削除されました。これは、pos が指す位置が解放され、pos は引き続き pos 位置の値を変更するために使用されることを意味します。
実行すると、次のエラーが報告されます。
これは典型的な反復子の失敗の問題です
8、スプライス
スプライスはデータを転送することです
最初の使用法のみをリストします。これは、x リンクされたリストの内容を pos 位置に転送することです。
2 つの連結リストがあり、1 つの連結リスト l は 1 2 3 4、もう 1 つの連結リスト r は 5 6 7 です。l の連結リストの位置、つまり 2 番目のデータの位置を見つけて、全体を転送します。 r この位置にリンクされたリスト データがあるため、 1 5 6 7 2 3 4 となりました。
9、削除
削除は、値 val のデータを削除することです。
リンクされたリスト 1 2 3 4 4 4 があるので、(4) を削除します。
結果を観察すると、remove は値 4 を持つすべての数値を削除することがわかります。
10、仕分け
sort は並べ替えアルゴリズムです
Vector で述べたように、ヘッダー ファイルのアルゴリズムにはソート アルゴリズムもありますが、なぜリストに独自のソート アルゴリズムが必要なのでしょうか。
理由は非常に簡単です。アルゴリズム ヘッダー ファイルの並べ替えは、連続ストレージ スペースを持つコンテナーのみをサポートします。並べ替えアルゴリズムの並べ替えは実際にはクイック ソートですが、リスト ストレージ スペースはそうではないため、自分で実装する必要があるからです。 。
l.sort() を使用するだけです。デフォルトは昇順です。
降順で並べ替えたい場合は、sort の 2 番目の使用法、つまりファンクター関数を渡します。
昇順のファンクターは小さく、降順のファンクターは大きくなりますが、大きいものを使用する場合は、ヘッダー ファイル関数を含める必要があります。
以下の図に示すように、匿名オブジェクトを渡すだけです。