vector&list[GeekBand]

2646 ワード

この文書では、vectorとlistの使い方、適切なシーン、および実際のビジネスシーンにおけるvectorとlistの代価を推定できない場合にvectorとlistをどのように使用するかについて説明します.
1使い方
vectorとlistはC++標準ライブラリで提供される2つのコンテナです.実は、この2つのコンテナは、私たちが学んだデータ構造の配列とチェーンテーブルと同じです.ただし、標準ライブラリはテンプレートとして実装され、より汎用的になります.C++11に追加されたいくつかの方法を簡単に紹介します.その他の内容は張先生の授業を参照してください.1.1コンストラクタC++11はリスト初期化をサポートするため、コンテナのコンストラクタにリスト初期化付きコンストラクタが追加された.関数宣言は次のとおりです.C c{a, b, c}このコンストラクション関数があれば、vector/listを次のように構築できます.vector ivec{1, 2, 3, 4, 5};list ilst{5, 6, 7, 8, 9};C++11以前に、次の方法で同じ目的を達成します.
vector oivec;
for (int i = 0;i < 5;i++)
    oivec.push_back(i);
//  
int intArray[] = {1, 2, 3, 4, 5};
vector oivec1(intArray, intArray + 5);

1.2付与値は、リストの初期化のおかげであり、コピーもリストの付与値をサポートする.声明はc1 = {e1, e2, e2}.使用法はコンストラクション関数と似ています.1.3追加/削除挿入/削除新しいインタフェースは以下の通りである.
c.emplace(inits) //  inits        c     ,    c 
c.emplace_back(inits)
c.emplace_front(inits)

一般的には、エレメントを挿入して使用しますc.insert(args).ここでargsはcの要素のオブジェクトです.Insertのメンバー関数を呼び出すと、要素タイプのオブジェクトをコンテナに渡し、コンテナにコピーします.emplaceを使用すると、パラメータを要素の構造関数に渡します.Emplaceは、これらの要素を直接使用してオブジェクトを構築し、コンテナに保存します.使用例は次のとおりです.
vector > cvec; /*      complex     */
complex c(1, 2);
cvec.insert(cvec.begin(), c);       /*C++11         */
cvec.emplace(cvec.begin(), 2, 3); /*c++11       ,         emplace,emplace   complex     */

2シーンに合わせる
このセクションではvector&listの使用シーンについて説明します.一般的にvectorは配列を実現します.つまり、配列要素を格納するために連続したメモリ空間を割り当てます.listは双方向チェーンテーブルとして実現され、双方向アクセスが容易になります.従ってvectorとlistもそれぞれ配列とチェーンテーブルの長所と短所を有する.vectorの長所と短所:1.利点-効率的で柔軟なメモリ管理を提供します.-ランダムアクセスをサポートし、アクセス速度が非常に速い2.欠点+配列の間に要素を挿入するには後続の要素を移動する必要があるため、配列を挿入するのが遅い+データを挿入する際に大量のメモリ割り当てlistを伴う可能性があるメリットとデメリット:1.利点+listは一般的にチェーンテーブルとして実装され、ノードとノードの間にポインタでリンクされているため、listに要素を挿入/削除するのは速く、定数の時間しかかかりません.2.欠点+ランダムアクセスはサポートされておらず、list内の要素へのアクセス速度はlistの要素数と正に相関している.上記の紹介から、vectorとlistがそれぞれ似合うシーンを見つけるのは難しくありません.私たちのビジネスでコンテナ内の要素に迅速かつランダムにアクセスし、配列にデータを挿入する必要が高くない場合は、vectorは良い選択です.ビジネスが迅速な挿入に対するニーズが高く、ランダムなアクセス要素に対する要求が低い場合はlistを選択できます.もちろん、それ以外に、いくつかの基本的な原則があります:1.通常はvectorを使用することをお勧めしますが、良い理由がない限り.2.プログラム要素が小さくて多い場合、スペースの追加コストが重要であればlistを使用しないでください.
3ビジネスシーンがはっきりしないvectorとlistの使い方
実際の開発ではvector/listがシステムのパフォーマンスに及ぼす影響を正確に評価できない場合がありますが、vectorやlistが必要ないくつかの共通の操作、挿入、クエリーなどがあります.このとき、vecotr/listを組み合わせてvector/listの共通インタフェースを定義するアダプタListAdpterを定義できます.そして,我々のプログラムはListAdpterの動作を呼び出すことによって,さらにプログラムに対して下位層の実装を遮蔽する.次に、システムの圧力テストを行い、vector/listがシステムに及ぼす影響を評価し、どのコンテナを有効にするかを選択します.
4参考
1.cpp primer 5th edition