容器
シーケンスコンテナ
それらの配列順序と入力順一貫した、一般STLシーケンスコンテナに使用される三つがあります:vector
、deque
、list
;
ベクター
ランダムアクセスを可能にする、すなわち直接任意の要素のインデックスにアクセスするが、ヘッドの中央でより多くの時間がかかりアクセスと、高尾利点に追加の要素又は除去要素効率であることができる、など。
#include<iostream>
#include<vector>//头文件
using namespace std;
int main()
{
vector<int> arry;//空容器
for(int i = 0;i <= 6;i ++)
arry.push_back(i);
for(int i = 0;i < arry.size();i++)
cout<< arry[i]<<" ";
return 0;
}
前記size()
機能コンセンサス容器の配列が、
することができ[ ]
、指定されたインデックスに2つの要素をアクセスします。
と
彼の利点であるが、不十分な要素はの中央に挿入され、いわゆる双方向キュー、尾部及び要素の高効率挿入ヘッド、等、を達成するために時間がかかります。
#include<iostream>
#include<deque>//头文件
using namespace std;
int main()
{
deque<int> arry;//空容器
for(int i = 0;i <= 6;i ++){
arry.push_back(i);
arry.push_front(i);
}
for(int i = 0;i < arry.size();i++)
cout<< arry[i]<<" ";
return 0;
}
前記push_front()
キュー要素の頭部を挿入します。
リスト
それは二重リストをリンクされている、任意の位置での実装高効率の挿入や削除の利点の嘘は、不利な点は、ランダムアクセスではありません。
#include<iostream>
#include<list>//头文件
using namespace std;
int main()
{
list<int> arry;//空容器
for(int i = 0;i <= 6;i ++)
arry.push_back(i);
while(!arry.empty()){
cout<< arry.front()<<" ";//输出第一个元素但不执行删除操作
arry.pop_front();//删除第一个元素但不返回被删除的元素
}
return 0;
}
連想コンテナ
連想コンテナは、一般的に、親ノードと右のノードの値が大きい値よりも小さい左サブツリーの親ノードの値より、二分木によって実現されます。共通:set
、multiset
、map
、multimap
4つのコンテナ。
セットする
set
自動選別の内部要素の値は、各要素は一度だけ、繰り返すことができない現れることができます。
マルチセット
multiset
そしてset
好きですが、重複する値を許可します。
以下のような達成するために:
#include<iostream>
#include<set>
using namespace std;
int main()
{
typedef set<int> intset;//缺省排列,默认operaotr<规则
intset arry;
arry.insert(1);
arry.insert(2);
arry.insert(3);
arry.insert(4);
arry.insert(5);
intset::const_iterator pos;
for(pos = arry.begin();pos != end.();++pos)
cout << *pos << " " ;
return 0;
}
すべてのコンテナが関連付けられているinsert
挿入要素を提供する機能。
しかし、私はまた、強調したいinsert
機能を、容器内の他の用途:
- 指定された位置には、要素の値valを「挿入」、およびイテレータ要素へのポインタを返す前に、
iterator insert( iterator it, const TYPE &val );
- 値valとその「挿入」をnum要素の前に指定された位置
void insert( iterator it, size_type num, const TYPE &val );
- すべての要素の間隔[開始、終了)「に」その前の指定された位置。
void insert( iterator it, input_iterator start, input_iterator end );
地図
map
要素は数字のペアの形、すなわち、で存在している(key,value)
キーインに応じて、各要素key
ソートされ、一度だけ、各キー。
マルチマップ
multimap
そして、map
似ていますが、重複キーを許可します。
以下のような達成するために:
#include<iostream>
#include<map>
using namespace std;
int main()
{
typedef map<int,int> intmap;//缺省排列,默认operaotr<规则
intmaparry;
arry.insert(make_pair(1,1));
arry.insert(make_pair(4,6));
arry.insert(make_pair(2,4));
arry.insert(make_pair(7,1));
arry.insert(make_pair(6,9));
intmap::const_iterator pos;
for(pos = arry.begin();pos != end.();++pos)
cout << pos->second << " " ;
return 0;
}
前記make_pair
関数は、生成された(key,value)
要素を、
ポインタの内容を前記first
ポインティング・キーは、second
格納された値を指します。
もちろんmap
容器は、上記の形態に加えて、そこに直接割り当てであるか、または元素形態を生成する、マップすることができるoperaator[ ]
:下付き文字キーであり、割り当ての値は、などとも呼ばれる連想配列を、記憶されています
#include<iostream>
#include<map>
using namespace std;
int main()
{
typedef map<int,int> intmap;//缺省排列,默认operaotr<规则
intmaparry;
arry[1] = 3;
arry[3] = 1;
arry[6] = 7;
intmap::const_iterator pos;
for(pos = arry.begin();pos != end.();++pos)
cout << pos->second << " " ;
return 0;
}
上記のフォームを使用して、私たちのように、我々は値を挿入するとことを言及する価値があるarry[10] = 1
が、map
コンテナではありませんarry[10]
。この時点では、すなわち、容器に追加された新しい要素を生成しますarry[10] = 1
。mulltimap
彼は多くの場合になりますので、容量は、使用することはできませんすなわちインデックス、格納された複数の値に対応します。
コンテナアダプタ
stack
、queue
、priority_queue
ここでstack
容器は、次のLIFO
元の値、即ち、LIFO(スタック)。
queue
通常のキュー、続くFIFO
FIFO元の値を。
priority_queue
プライオリティキューは、優先度などのランキング基準要素によって決定されるoperator<
、すなわち昇順に基準に、優先順位を与えることができます。
イテレータ
イテレータが横断されSTL
、すべての要素をオブジェクトコンテナを、あなたは、同等の、存在する任意の位置を指し示すことができc language
、その後、STLに、私たちは見ることができないポインタのイテレータ、ポインタとメモリがバインドポインタの、しかし、およびイテレータは、コンテナエレメント結合され、その後、削除、イテレータはその再割り当てする前に、無効となり、このイテレータもはやアクセスをすることができます。
イテレータは、次の2つのカテゴリに分かれて:
**双方向イテレータ:**双方向イテレータは、双方向にすることができる持っているlist
、set
、multimap
、map
、multiset
イテレータは、あります。
ランダムアクセスイテレータ**:**ランダムアクセスすることがあります。
一般的操作次のイテレータで使用されるがあります
operator *
:現在の要素の位置の値を返し、
operator ++
:イテレータ移動後方、
operator == and operator !=
同じ場所に反復子点を分析するステップと
operator=
:反復子が割り当てられ、すなわち彼の位置を与えるためにポイント、道路標識?
さらに、いくつかの機能を持つ反復子
begin()
:コンテナの開始点;
end()
:容器のエンドポイント、すなわち、最後の要素の次の位置、
コンテナは、前述に加えて、空であるかどうかを決定するempty(),size()
、あるbegin() == end()
等しいです空にします。
イテレータは、2つのタイプ有する任意の容器:
container::iterator
読み書きモード、コンテナ内の要素の値を変更することができ、
container::const_iterator
読み取り専用モードでは、要素の値は、コンテナを変更することができません。
私たちは、イテレータループ、事前インクリメント一般的に使用する場合にも、その点に注意してください++pos
背面にも、学生が知っておくべき経験や形状をプログラミング++、Cのこの事を余分に一時オブジェクトを必要とするので、それが達成されるの
container operarot++ (int)(){
container a(this);
++this;
return a;
}
あなたが扱っている場合はvector
、deque
それが増加またはアカウントの問題を考慮して、ループ内の要素を削除することができるときとき、イテレータは無効にされてもよいです。
また、そこにあるreverse_iterator
ことが多い中で、逆イテレータであることrbegin()
、およびrend()
使用と。