STLシーケンス容器【vector】【deque】【list】


stl容器では容器を2種類に分け,順序容器と関連容器に分けていることが知られている.
シーケンスコンテナには、ダイナミック配列vector、両端キューdeque、チェーンテーブルlistの3種類があります.
(csdnの文字レイアウトに深刻なツッコミを入れ、書いた版が発表されると変わった)
一:順序容器の常用操作
1:最初の順序の容器の反復器
定義:T::iterator iter;
/*すべてのシーケンスコンテナをサポート*/
*iter//反復器の参照を返します
iter->mem//iterの解引用は(*iter)に等しい.men
++iter|iter+//自加
--iter|iter--//自減
iter1==iter2  |  iter1!=iter 2//比較
/*vectorとdequeのみサポート*/
iter+n|iter-n反復器プラスマイナス整数
iter 1+=iter 2|iter 1-=iter 2反復器複合演算
iter 1-iter 2反復器減算
>,>=,<,<=反復関係子!!反復器間でのサイズ比較にも使用できます
2:反復範囲
c.begin()|c.rend()は、容器内の最初の要素を指し、後に逆順序反復器を指す.
c.end()|c.rbegin()は容器の最後の要素を指す
c.size()はコンテナ要素の個数を返す
c.max_size()は、最大収容要素数を返します.
c.empty()が空かどうかは、ブール値を返します.
c.resize(n)容器の長さをn個の要素を収容できるように調整する
c.resize(n,t)はn個の要素を収容し、新しく追加されたのはすべてtである.
c.capacity()現在のコンテナの格納可能な要素の総数を取得
c.reverse(n)容器にどれだけの空間を残すか
3:コンテナ定義のタイプ別名
size_type符号なし整形、容器長
iterator反復器タイプ
const_iterator読み取り専用反復器タイプ
reverse_iterator逆シーケンスアドレス反復器
const_reverse_iterator読み取り専用逆シーケンスアドレス反復器
difference_type反復器差分値、負の値
value_type要素タイプ
reference要素左値タイプ
const_reference定数要素左値タイプ
/*定義方法C::タイプ別名変数;
4:容器の初期化
C c; 空のコンテナを作成
C c(c2); コンテナの作成はc 2からのコピーです
C c(b,e);コンテナの作成は反復器bからeのコピーです
C c(n,t);n個のt要素から初期化を作成する
C c(n);n個の初期化コンテナを作成する
5:要素の追加と削除
c.push_back()末尾に要素を追加
c.push_front()ヘッダに要素を追加します.vectorには適用されません.
c.insert(p,t)反復器p位置追加t
c.insert(p,n,t)反復器p位置にn個のtを追加
c.insert(p,b,e)反復器pの位置がある反復器bからeの要素に更新される
要素の削除
c.erase(p)反復器pの位置の要素を削除する
c.erase(b,e)反復器bからeの範囲内の要素を削除する
c.clear()すべての要素をクリア
c.pop_back()コンテナの最後の要素を削除
c.pop_front()最初の要素を削除しvectorには適用されません
6:コンテナ要素へのアクセス
c.back()は、コンテナの最後の要素参照を返します.
c.front()は最初の要素参照を返す
c[i]|c.at(i)はi番目の要素参照を返し、listには適用されません.
7:付与とswap
c 1=c 2 c 1はc 2に割り当てられ、c 1の要素を削除し、c 2をc 1にコピーします.
c1.swap(c 2)交換c 1とc 2の要素
c.assign(b,e)反復器bからeの要素ですべてのcを更新する
c.assign(n,t)cでn個のtに更新
二:順序容器間の区別及び容器の選択
1:vectorとdequeはランダムに要素にアクセスでき、vectorとdequeはオペレータ[]を再ロードしましたが、listはなく、反復器でしかアクセスできません.
2:中間位置に要素を挿入する回数が多い場合はlistを優先し、先頭と末尾に多く挿入する場合はdequeを優先します.
3:プログラミングでコンテナを交差させることで効率を向上させ、読み取り時に要素を中間に挿入し、ランダムに要素にアクセスする必要がある場合はlistで読み込み、vectorにコピーして操作することができます.
注意:vectorはメモリを連続的に割り当てていることを知っています.新しい要素を追加した後、このメモリがいっぱいになったら、vectorはもっと大きな内訓を探して、現在の要素をコピーして、前のメモリを解放しなければなりません.このような操作は何度もすれば時間を無駄にします.解決策は、コンテナが空間を割り当てることであり、適切に空間を残すことです.すべての要素がコピーされることはありません.
三:シーケンシャルコンテナアダプタ
シーケンスコンテナアダプタには、キューqueue、スタックstack、および優先キューpriority_が含まれます.queue
アダプタコンセプト:ある物事の動作を別の物事に類似させる
コンテナアダプタコンセプト:既存のコンテナタイプを別の抽象タイプでアダプタヘッダファイルを実装します.
#include
#include
アダプタ初期化
stack s;空のスタックを初期化
stack stk(s);sのコピーに初期化
1:スタックアダプタ
まず、stackの関連コンテナは任意のタイプであり、vector、deque、listの上にデフォルトのdequeを確立することができます.
Queueはpush_のサポートを要求front()なのでlistの上とdeque、デフォルトdequeのみです.
priority_queueはランダムアクセスを要求するためvectorとdequeの上に構築でき、デフォルトvectorです.
実際に許可されたコンテナの上に構築する方法を定義できます.
stack> s;//後ろの2つに注意>>別々にしなければなりません.そうしないと、出力ストリームとみなされます.
1:スタックがサポートするアクション:
s.empty()判空
s.size()は要素の数を返します
s.pop()スタックトップ要素の削除
s.top()はスタックトップ要素を返す
s.push()スタックトップへの圧入
2:キューおよび優先キュー操作
s.empty()判空
s.size()は要素の数を返します
s.pop()キューヘッダ要素の削除
s.front()はキューヘッダ要素を返し、キューにのみ使用します.
s.back()はキューの末尾要素を返し、キューにのみ使用します.
s.top()は、優先キューにのみ使用される最優先要素を返します.
s.top()はスタックトップ要素を返す
s.push()圧入キュー
優先キュー優先度定義デフォルトは'<'、オペレータ、定義方法:
<span style="font-size:10px;">struct Node
{
    int num;
    int cycle;
    int count;
    int zong;
    bool operator < (const Node &a) const  //    
    {
        return a.zong<zong;   //   zong    ,   num    !
        return a.num<num;
    }
};</span>

シーケンスコンテナ練習コード:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <queue>
#include <list>
using namespace std;
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 11000;

int main()
{
    /*9.1.1*/
    vector<int> ievel;
    vector<string> svec;//(get_word_count("Chimera"));
    svec.push_back("i ccc");
    svec.push_back("yang can");
    svec.insert(svec.begin()+1,"momo");
    svec.insert(svec.begin()+1,5,"hahha");
    string s[10]={"what","is","your","name"};
    svec.insert(svec.begin()+1,s,s+4);
    vector<string>::iterator i=svec.begin();
    svec.erase(i+0);
    //svec.erase(i,i+2);
    for(int i=0;i<svec.size();i++)
        cout<<svec[i]<<endl;
    cout<<"---->"<<svec[10]<<endl;
    cout<<"xxxxx"<<svec.at(10)<<endl;  //       ,     out_of_range
    /*vector<string>::const_reverse_iterator ii;
    for(ii=svec.rbegin();ii!=svec.rend();ii--){
        cout<<*ii<endl;
    }*/
    /*list<string> slist(svec.begin(),svec.end());
    list<string>::iterator it;
    for(it=slist.begin();it!=slist.end();it++)
        cout<<*it<<endl;
    const list<int>::size_type ll=64;//    
    list<string> ls(ll,"eh?");
    for(it=ls.begin();it!=ls.end();it++){}
        //cout<<*it<<endl;
    /*9.1.2
    vector<vector<string> > v;
    vector<string> s1;
    v.push_back(s1);*/
    list<int> lis(10,42);
    lis.resize(15); //      
    lis.resize(25,-1); //       
    //lis.resize(5);
    list<int>::iterator it=lis.begin();
    for(;it!=lis.end();it++)
    {
        cout<<*it<<endl;
    }
    return 0;
}

コンテナアダプタ練習コード:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;

struct Node
{
    int x;
    bool operator < (const Node &a) const
    {
        return a.x<x;   //   zong    
    }
};

int main()
{
    priority_queue<Node> p;
    Node s;s.x=5;
    p.push(s);
    s.x=10;
    p.push(s);
    s.x=1;p.push(s);
    while(!p.empty())
    {
        printf("%d
",p.top()); p.pop(); } return 0; }