コンテナの動作シーケンス

各容器は、定義されたタイプの有用なセットを提供し、そして次

コンテナ内の要素を追加します。1.
コンテナ内の要素を削除します。2.
コンテナのサイズを設定します。3.
コンテナ内の最初と最後の要素を取得します。4.

typedefで定義された1コンテナ

フロントへ戻る、及び特定の関連繰り返し反転動作から容器上の逆反復。++ rverse_iter代わりポインティング要素の後者の要素に対応し、前者は、
あなたが参照する場合は、VALUE_TYPE缶と、コンテナ要素を使用するために必要な、基準const_referenceタイプによって達成することができるように。ジェネリックプログラミングでは、これらの要素は、関連の定義が有用です。

コンテナ型の定義されたエイリアス 説明
size_type unsigned int型の容器容量、容器の最大長
イテレータ イテレータ
const_iteratorの 読み取り専用イテレータ要素
reverse_iterator リバースイテレータ
const_reverse_iterator 読み取り専用要素を逆イテレータ
difference_type 署名された2回の反復子の差タイプ
VALUE_TYPE コンテナ要素の型
参照 コンテナ要素の参照
const_reference const参照

2.開始と終了のメンバー

オペレーティング 説明
c.begin() 容器Cの最初の要素にイテレータポインティングを返します
c.end() コンテナの点cの最後の要素過去の反復子を返します
c.rbegin() リバースイテレータc.rbegin()==(--c.end())
c.rend() (--c.rend())== c.begin()

イテレータ図に逆イテレータ参照。

コンテナ要素を追加するために3

すべての容器は、一backコンテナの運転終了時に要素を挿入するため、容器の長さ+をサポートします。
C++ string text_word; while(){ container.push_back(text_word); }

キーコンセプト

いくつかの初期化コンテナ要素の使用と同様コンテナ添加元素、容器に試行値をコピーする要素は、要素がコピーに格納されます。

添加元素運航

オペレーティング 説明
c.push_back(T) ボイド戻り、容器の端部におけるインサート要素、償却時間計算:O(1)
c.push_front(T) 戻り、ボイド、容器Cの挿入の段階の要素、および該当リスト両端キュー
c.insert(P、T) イテレータの位置新しく挿入された素子は、pの前に挿入さへのポインタを返す、Pが(端と考えられる)、したがって挿入は、pの前に挿入され
c.insert(P、N、T) N t個のP前に、ボイド、繰り返し挿入を返します。
c.insert(P、B、E) バックボイド、内側インサート要素[B、E)レンジPに先立っ

そこにはpush_frontベクトル関数はありませんが、インサート(vec.begin()、T)を用いて実施することができるが 。
p-位に関連する動作時間の複雑さ、要素を移動関与している挿入、平均時間計算量はO(N)であります

4.関係演算子

すべてのコンテナは、より多くの二つの容器を達成するために、関係演算子をサポートしています。比較の容器は、同じコンテナタイプと同じ要素型を有していなければなりません。
コンテナの比較は、比較に基づいてコンテナ要素です。コンテナ要素が関係演算子をサポートしていない場合はこのように、コンテナがサポートしていません。
C1場合、C2は、容器、および発現されているc1 < c2方法、2つのコンテナの同じタイプ、および、要素の同じタイプ、及び素子支持<演算子。

運転コンテナのサイズ

オペレーティング 説明
c.size() 要素cの数を返します。
c.empty() 返し空の容器は、決定したブール値です
c.resize(N) これはn個の要素を収容することができるように、コンテナのサイズを調整します。場合N <c.size()、過剰の要素を削除する;もしN> c.size()、新たな要素を追加使用して値を初期化します
c.resize(N、T) N> c.size()、Tは、付加価値要素で初期化されている場合

サイズ変更操作の失敗

ベクトルと両端キューの操作は操作はすべてのイテレータの故障の原因となり、サイズ変更では、reallocのは、再割り当て
サイズ変更がイテレータは、要素が失敗し、削除された、コンテナを圧縮する場合

6.アクセス要素

要素が空である場合、前面は、参照の最後の要素を戻り、参照の最初の要素を返します。

オペレーティング 説明
c.front() 最初の要素の参照を返します。
c.back() それは最後の要素への参照を返します。
C [N] ベクトルのみ両端キューに適用するには、nはコンパイラの値をチェックしません。
c.at(N) 只适用vector和的确,n值编译器不检查,会抛出out_of_range运行时错误

7. 删除元素

操作 说明
c.erase(p) 删除迭代器p所指向的元素,返回一个迭代器,指向删除元素后面的元素,如果p指向最后一个元素,则返回容器末尾下一位置
c.erase(b,e) 删除迭代范围[b,e),返回e位置,如果e本身为容器末尾下一位置,则返回e也为容器末尾下一位置
c.clear() 删除容器中所有元素,返回void
c.pop_back() 删除容器c最后一个元素,返回void
c.pop_front() 删除容器第一个元素,返回void

注意容器删除操作要检查容器是否为空,以及所给迭代器是否合法,编译器不负责检查。
pop_front和front操作配套使用,实现以栈方式处理容器。
pop_front只有deque和list才有的操作,vector没有

#include <iostream>
#include <vector>
#include <list>
using namespace std;
#define ArrayLength(X) ((sizeof(X))/(sizeof(X[0])))
int main()
{
    int ia[]={1,2,3,4,5,6,7,8,9,10};
    vector<int> ivec(ia,ia+ArrayLength(ia));
    list<int> ilist(ia,ia+ArrayLength(ia));
    for (vector<int>::const_iterator beg=ivec.begin();beg!=ivec.end();++beg)
    {
        cout<<*beg<<" ";
    }
    cout<<endl;
    for (list<int>::const_iterator beg=ilist.begin();beg!=ilist.end();)
    {
        //清除list中所有奇数
        if (*beg & 0x01)
        {
            cout<<"清除"<<*beg <<" ";
            beg = ilist.erase(beg);
            cout<<"之后 beg指向元素"<<*beg<<endl;
        }
        else
        {
            ++beg;
        }
    }
    cout<<"iList:";
    for (list<int>::const_iterator beg=ilist.begin();beg!=ilist.end();++beg)
    {
        cout<<*beg<<" ";
    }
    cout<<endl;
    cout<<"vector:";
    for(vector<int>::const_iterator beg=ivec.begin();beg!=ivec.end();)
    {
        //清除vector中所有偶数
        if (*beg & 0x01)
            ++beg;
        else
            beg=ivec.erase(beg);
    }
    for (vector<int>::const_iterator beg=ivec.begin();beg!=ivec.end();++beg)
    {
        cout<<*beg<<" ";
    }
    cout<<endl;
    system("pause");
    return 0;
}

8. 赋值与swap

与赋值相关的操作符都作用于整个容器。除swap操作外,其他操作都可以用erase和insert操作实现。赋值操作符首先删除其左操作数容器内的所有元素,然后将右操作数容器内的所有元素都插入到左边容器

c1=c2;
c1.erase(c1.begin(),c1.end());
c1.insert(c1.begin(),c2.begin(),c2.end());

赋值和assign操作都使左操作数容器的所有迭代器失效。
swap操作则不会使迭代器失效。完成swap操作后,尽管被交换元素已经存放在另外一个容器,但是迭代器仍然指向相同元素。

操作 说明
c1=c2 删除容器c1内元素,将c2内元素复制给c1,c1和c2类型相同(容器类型,元素类型)
c1.swap(c2) 交换内容:调用完该函数,c1存放的是c2内的元素;c2存放的是c1内的元素。c1和c2必须类型相同。
c.assign(b,e) 重置c元素,将[b,e)内的元素复制到c,b和e必须是不指向c中元素的迭代器
c.assign(n,t) 将容器c重置为n个t值

使用assign

容器内の最初の削除要素を割り当て、次いで容器に新しい要素。代入演算子は、容器ASSIGNの同じタイプの同じタイプ(コンテナタイプ、要素タイプ)/コンテナの要素型/互換性が、同一ではありません。char *文字列型のタイプに変換することができます

//容器类型不相同,元素类型相同都是int
ivec.assign(ilist.begin(),ilist.end());
vector<char *> svec(4,"china tea");
//访问元素返回引用可以作为左值进行修改
svec.front()="chinese";
svec.back()="comedy";
svec.at(1)="one";
for (vector<char*>::iterator beg=svec.begin();beg!=svec.end();++beg)
{
  cout<<*beg<<" ";
}
cout<<endl;
list<string> slist;
//容器类型不相同,元素类型相互兼容
slist.assign(svec.begin(),svec.end());
for (list<string>::iterator beg=slist.begin();beg!=slist.end();++beg)
{
  cout<<beg->c_str()<<" ";
}
cout<<endl;
//重置元素,和容器初始化相似
ivec.assign(10,1);

コストを節約するための要素を削除するには、スワップ操作を使用します

すべての要素は、コンテナ内の2つの機能を実現するためにスワップ操作を交換します。コンテナは、完全一致を交換する必要があります。この操作は定数時間で実現交換を確保するために、任意の要素を挿入または削除されません。任意の移動要素が存在しない場合には、イテレータは失敗しません。

vector<string> svec1(10);
vector<string> svec2(20);
svec1.swap(svec2);

交換を行った後、文字列svec1 24個の要素があり、文字列svec2に10個の要素があります。[0] svec_beg svec1前に交換するイテレータ場合、切り替え点svec_beg svec2 [0](のみ同一の記憶素子であり、反復子は、別々の容器に失敗していません)。為替スワップ操作の2つだけの容器内部データ構造、容器内の各スイッチング素子の、すなわちメモリアドレス、変数格納された各スイッチング素子のない値。

おすすめ

転載: www.cnblogs.com/gaochaochao/p/11890694.html