lists stl
STLのリストとその実装についてすべてを知るようになります。
リストはシーケンシャルコンテナです。リストには、連続していない場所に要素が含まれています。以前のチュートリアルで配列とベクトルについて説明しました。
配列コンテナとベクトルコンテナの場合、これらのコンテナは連続したメモリにデータを格納するため、新しい要素用のスペースを確保するために既存の要素を適宜シフトする必要があるため、これらのコンテナの中央での挿入操作は非常にコストがかかることがわかります。
=>完全なC ++チュートリアルリストを調べるには、ここを参照してください。
xmlファイルを表示するにはどうすればよいですか
学習内容:
概要概要
このリストは、配列コンテナーとベクトルコンテナーのこの欠点を克服するコンテナーです。これにより、オーバーヘッドをあまり発生させることなく、リストの任意の場所に要素を挿入できます。しかし、トラバーサルに関する限り、リストはベクトルよりも低速です。
このチュートリアルでは、STLでのリストの実装と、トラバーサル、操作、およびリストへのアクセスのさまざまな操作を例とともに示します。
リスト操作の大部分はベクトルの操作と類似しているため、ベクトルに関するチュートリアルをすでに読んだ読者は、リストの概念の解釈に問題がないことに注意してください。
宣言と初期化
リストコンテナを実装し、そのすべての利点を利用するには、プログラムにヘッダーファイルをインクルードする必要があります。
#include
リストコンテナの一般的な宣言は次のとおりです。
std::list listName;
例えば、次のように、int型の「mylist」という名前のリストを宣言できます。
std::list mylist;
宣言時にリストを初期化したり、サポートされている操作の1つを使用してリストに要素を追加したりすることもできます。
上で作成したリストを初期化する方法を見てみましょう。
std::list mylist = {1, 1, 2, 3, 5};
上記の初期化は、以下に示すようにメモリに配置されます。
リストを初期化すると、イテレータを使用してリストの要素にアクセスできます。イテレータ関数の「begin」と「end」は、リスト要素をトラバースするのに役立ちます。
注意: リストのイテレータは、逆イテレータ(rbegin、rend)、定数イテレータ(cbegin、cend)、定数逆イテレータ(crbegin、crend)などの他のイテレータもサポートしており、ベクトルと同様の方法で使用できます。
次の例はこれを示しています。
#include #include #include #include using namespace std; int main() { list mylist = {1, 1, 2, 3, 5}; cout<<”List elements are: “; list::iterator it; for(it=mylist.begin();it!=mylist.end();++it) cout<<*it<<” “; }
出力:
リスト要素は次のとおりです:1 1 2 3 5
したがって、上記の例では、フィボナッチ数列のリストを宣言しました。次に、リストと同じタイプのイテレータを宣言し、forループを使用して、リストの内容を最初から最後まで出力します。
次に、STLのリストコンテナが提供する操作または関数にジャンプしましょう。
リスト操作
- インサート: 指定された位置に要素を挿入するために使用されます。挿入された最初の要素を指すイテレータを返します。
挿入(pos、num_elem、elem)
どこ、
pos => 新しい要素が挿入される位置。
num_elem => 挿入する要素の数。デフォルトは1です。
アイテム=> 挿入する実際の値。
例を挙げて挿入機能を理解しましょう。
#include #include // for list operations using namespace std; int main() { list mylist = {1,1,2}; list::iterator it = mylist.begin(); // iterator to point to 4th position advance(it,` 3); // inserts 3 at 4th position mylist.insert(it, 3); cout << 'The list after inserting' << ' 1 element using insert() is : '; for (list::iterator i = mylist.begin();i != mylist.end();i++) cout << *i << ' '; cout << endl; }
出力:
insert()を使用して1つの要素を挿入した後のリストは、次のとおりです。11 2 3
これは、4に1つの要素のみを挿入する例です。th最終的に最後の位置になるリスト内の位置。したがって、最初に、リストの先頭を指すイテレータを定義したリストがあります。次に、このイテレータを4にシフトしますth位置を指定してから、insertを呼び出して1つの要素を挿入します。
挿入関数で2番目のパラメーターを指定することにより、複数の要素を挿入することもできます。指定されていない場合は常に、デフォルトで1になります。
- push_back :リストの最後に新しい要素を追加します。
- push_front :リストの先頭に新しい要素を追加します。
push_back関数とpush_front関数の使用法を示す例を見てみましょう。
#include #include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3}; cout<<'List elements are: '; printlist(mylist); mylist.push_front(0); mylist.push_back(5); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
出力:
リスト要素は次のとおりです:1 1 2 3
push_frontとpush_backの後にコンテンツを一覧表示します:0 1 1 2 3 5
この例では、最初に、push_front関数とpush_back関数をそれぞれ使用して、前面と背面にそれぞれ1つずつ、2つの要素すべてを作成して一覧表示します。出力には、両方の機能が実行された後の変更されたリストが表示されます。
- pop_back :リストの最後の要素を削除して、リストのサイズを1つ縮小します。
- pop_front :リストの最初の要素を削除して、リストのサイズを1つ縮小します。
次の例は、リストのpop_backおよびpop_front操作の使用法を示しています。
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); mylist.pop_front(); mylist.pop_back(); cout<<'
List contents after push_front and push_back: '; printlist(mylist); }
出力:
リスト要素は次のとおりです:1 1 2 3 5
push_frontおよびpush_backの後にコンテンツを一覧表示します:1 2 3
操作の定義で説明されているように、操作pop_frontとpop_backはそれぞれ、リストの前と後ろから要素を削除します。つまり、リストの最初と最後の要素をそれぞれ削除するため、リストのサイズが1ずつ減ります。
- サイズ :リストのサイズ、つまりリスト内の要素の数を返します。
- 空の :リストが空かどうかを確認します。
- 消去 :リストから要素または要素の範囲を削除します。
- 晴れ :サイズを0にして、リストからすべての要素を削除します。
以下に示すのは、上記のすべての関数(サイズ、空、消去、クリア)の使用法を示す例です。
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'size of the list: '< 出力:
リスト要素は次のとおりです:1 1 2 3 5
リストのサイズ:5
最初の要素を消去した後のリスト:1 2 3 5
リストの新しいサイズ:4
クリア後のリストのサイズ:0
上記のプログラムは、リストの容量に関連する4つの機能すべてを示しています。リストの1つの要素を消去すると、リストのサイズが1つ減少することがわかります。リストでclear操作を呼び出すと、サイズは0になります。これは、リスト内のすべての要素が削除されることを意味します。
- フロント :リストの最初の要素の値を返します。
- バック :リストの最後の要素の値を返します。
- スワップ :あるリストの内容を、同じサイズとタイプの別のリストの内容と交換します。
- 逆行する :リストを逆にするアルゴリズム。
- ソート :指定されたリストを並べ替えます。
以下の例は、フロント、バック、リバース、ソート、およびスワップ機能の使用法を示しています。
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 2, 3, 5}; cout<<'List elements are: '; printlist(mylist); cout<<'
Front of the list: '< 出力:
リスト要素は次のとおりです:1 1 2 3 5
モバイルアプリケーションをテストする際のアプローチは何ですか
リストの先頭:1
リストの後ろ:5
逆リスト:5 3 2 1 1
奇数リストの内容:1 3 5 7 9
交換後
マイリスト:1 3 5 7 9
オッドリスト:5 3 2 1 1
このコードでは、最初に、リストmylistの表と裏の値を出力します。次に、このリストが反転され、反転されたリストが印刷されます。その後、順序が決まっていない奇数のリストをもう1つ定義し、「ソート」アルゴリズムを呼び出してこのリストをソートします。次に、swap関数を使用して2つのリストを交換し、交換されたリストを印刷します。
- スプライス :この関数は、あるリストの内容を指定された位置にある別のリストに転送するために使用されます。
両方のリストは同じタイプである必要があります。
splice(position、list);
どこ、
position =>リストの内容が転送される位置。
list =>要素が転送されるリスト。
以下の例は、スプライス機能の使用法を示しています。
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1, 8,13}; cout<<'List elements are: '; printlist(mylist); list seclist = {2,3,5}; cout<<'list to be spliced: '; printlist(seclist); list:: iterator it = mylist.begin(); it ++; it++; mylist.splice(it,seclist); cout<<'
List contents after splicing at position 2: '; printlist(mylist); }
出力:
リスト要素は次のとおりです:1 1 8 13
接合するリスト:2 3 5
位置2でスプライシングした後の内容を一覧表示します:1 1 2 3 5 8 13
ザ・ 例 は、2つのリストを使用していることを示しています。最初に、mylistのイテレータが2つの位置に移動され、次にsplice関数が呼び出されて、2番目のリストの内容が最初のリストの3番目の位置に転送されます。
- 行く :あるリストの内容を特定の位置で別のリストに転送するために使用できるスプライス機能とは異なり、マージ操作は2つのリストを直接マージして1つのリストを形成します。マージ操作の場合、両方のリストがソートされた順序である必要があります。
以下に、マージ機能を示す例を示します。
#include #include #include using namespace std; void printlist(list mylist) { list :: iterator it; for(it = mylist.begin(); it != mylist.end(); ++it) cout <<*it<<' '; cout << '
'; } int main() { std::list mylist = {1, 1,2,3,5,8}; list seclist = {4,6,7}; cout<<'First List: '; printlist(mylist); cout< 出力:
最初のリスト:11 2 3 5 8
2番目のリスト:4 6 7
2つのリストをマージした後のリストの内容:
1 1 2 3 4 5 6 7 8
したがって、上記のプログラムでは、ソートされた2つのリストがあります。これら2つのリストでマージ操作を呼び出します。結果のリストは、両方のリストの要素を含むソートされたリストです。
結論
STLのリストに関するこのチュートリアルは終了しました。このチュートリアルで、STLのリストに関する膨大な知識が得られたことを願っています。
=> ここでC ++トレーニングチュートリアルのA-Zを確認するには、ここをクリックしてください。
推奨読書