各容器は、定義されたタイプの有用なセットを提供し、そして次
コンテナ内の要素を追加します。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つだけの容器内部データ構造、容器内の各スイッチング素子の、すなわちメモリアドレス、変数格納された各スイッチング素子のない値。