定義
コンテナ:さまざまなデータ構造とアルゴリズムを操作できるテンプレートクラスと関数ライブラリ。実際には、さまざまなタイプのオブジェクトをコンテナのように格納できます。コンテナ内のすべてのオブジェクトは同じタイプである必要があります。
コンテナは、シーケンシャルコンテナとアソシアティブコンテナの2つのカテゴリに分類されます。
シーケンシャルコンテナ
シーケンシャルコンテナには、vector、deque、listの3種類があります。
コンテナ内の要素の位置が要素の値とは関係がない、つまりコンテナがソートされていないため、これらはシーケンシャルコンテナと呼ばれます。要素をコンテナに挿入するときは、要素を挿入する場所(テール、ヘッド、または中央のどこか)と要素を配置する場所を指定します。
1.ベクトル
連続ストレージ構造。各要素はメモリ内で連続しています。
最後に効率的なランダムアクセスと挿入/削除操作をサポートしますが、他の位置での挿入/削除操作は非効率的です。
2. Dequeの
連続ストレージ構造、つまり、各要素はベクトルと同様にメモリ内で連続です。違いは、dequeが2レベルの配列構造を提供し、最初のレベルが実際のコンテナを表すベクトルと完全に類似していることです。コンテナの最初のアドレスはレベルで維持されます。
このように、vectorのすべての機能に加えて、dequeは効率的なファーストエンドの挿入/削除操作もサポートします。
3.リストは、
二重リンクリスト構造を持つ非連続ストレージ構造です。各要素は、前方と後方のポインターのペアを維持するため、前方/後方トラバーサルがサポートされます。
効率的なランダム挿入/削除操作をサポートしますが、ランダムアクセスは非効率的であり、追加のポインターを維持する必要があるため、オーバーヘッドは比較的大きくなります。
シーケンシャルコンテナの選択:
a。ランダムアクセス操作が必要な場合は、ベクトルを選択します
。b。格納する必要のある要素の数がすでにわかっている場合は、ベクトルを選択します
。c。ランダムに挿入/削除する必要がある場合(だけでなく)両端で)、リスト
dを選択します。ヘッドエンドで挿入/削除操作が必要な場合にのみ両端キューを選択します。それ以外の場合はベクトルを選択します。
e。ランダムに挿入/削除し、ランダムにアクセスする必要がある場合は、ベクターとリストの間で妥協する必要があります。
f。大きな責任クラスオブジェクトを格納する場合、listはvectorよりも優れています。もちろん、この時点でvectorを使用してオブジェクトへのポインタを格納することもできます。これにより、効率も向上しますが、ポインタのメンテナンスは非常にエラーになります。傾向がある推奨されません。
注:vectorおよびdequeのイテレーターは算術演算をサポートし、listのイテレーターは++ / –演算のみを実行でき、通常の算術演算はサポートしません。
連想コンテナ
連想コンテナには、set、multiset、map、multimapの4種類があります。
連想コンテナ内の要素がソートされます。要素を挿入するとき、コンテナは特定の並べ替え規則に従って要素を適切な位置に配置するため、要素を挿入するときに位置を指定することはできません。
デフォルトでは、連想コンテナ内の要素は最小から最大(またはキーワードによって最小から最大)にソートされ、<演算子は要素またはキーワードのサイズを比較するために使用されます。ソートされているため、連想コンテナは検索時に非常に優れたパフォーマンスを発揮します。
上記の2種類のコンテナーに加えて、STLは、2種類のコンテナーに基づいて一部の関数をシールドし、関数の別の部分を強調表示または追加し、スタック(スタック)、キュー(キュー)、 priority_queue(優先キュー)。
コンテナ機能
すべてのコンテナには、次の2つのメンバー関数があります
。intsize():コンテナオブジェクト内の要素の数を返します。
bool empty():コンテナオブジェクトが空かどうかを判別します。
シーケンスコンテナと連想コンテナには、次のメンバー関数もあり
ます。begin():コンテナの最初の要素を指すイテレータを返します。
end():コンテナ内の最後の要素の後の位置を指すイテレータを返します。
rbegin():コンテナ内の最後の要素を指す逆イテレータを返します。
rend():コンテナ内の最初の要素の前の位置を指す逆イテレータを返します。
消去(...):コンテナから1つまたは複数の要素を削除します。
clear():コンテナからすべての要素を削除します。
コンテナが空の場合、begin()とend()の戻り値は等しく、rbegin()とrend()の戻り値も等しくなります。
シーケンスコンテナには、次の一般的に使用されるメンバー関数もあり
ます。front():コンテナの最初の要素への参照を返します。
back():コンテナ内の最後の要素への参照を返します。
push_back():コンテナの最後に新しい要素を追加します。
pop_back():コンテナの最後にある要素を削除します。
insert(...):1つ以上の要素を挿入します。この関数のパラメーターはより複雑であるため、ここでは省略します。
例
(ここでは、いくつかのコンテナーといくつかの関数の使用法のみを示します)
シーケンシャルコンテナー:
ベクターコンテナー
void main() //遍历、删除、插入
{
vector<int> v1;
v1.push_back(10); //copy 到申请的容器
v1.push_back(20);
v1.push_back(30);
//访问容器,定义一个迭代器: 相当于一个指针
//正向遍历
for(vector<int>::iterator it = v1.begin();it != v1.end();it++)
{
cout<<*it<<endl;
}
//逆向遍历
for(vector<int>::reverse_iterator rit = v1.rbegin();rit != v1.rend();rit++)
{
cout<<*rit<<endl;
}
//区间删除
v1.erase(v1.begin(),v1.begin()+2);
//指定位置删除
v1.erase(v1.begin());
//遍历删除
for(vector<int>::iterator dit = v1.begin();dit != v1.end();)
{
if(*dit == 2)
{
v1.erase(dit); //当删除迭代器所指向元素时,erase让it自下移
}
else
{
dit++;
}
}
//插入元素
v1.insert (v1.begin(),100); //头部插入数值100
v1.insert (v1.end (),200); //尾部插入数值200
return;
}
deque 容器
void printd(deque<int> &d)
{
for(deque<int>::iterator it = d.begin(); it != d.end();it++)
{
cout<<"元素"<<*it<<endl;
}
}
void main()
{
deque<int> d;
d.push_back(1); //在容器末尾增加新元素
d.push_back(2);
d.push_front(3); //在容器头尾增加新元素
d.push_front(4);
printd(d);
deque<int>::iterator it = find(d.begin(),d.end(),3); //查找指定元素3 找到时,返回该元素的迭代器;找不到时,返回end()。
if(it != d.end())
{
cout<<"3与第一个元素的距离为:"<<distance(d.begin (),it)<<endl;
}
}
連想コンテナ:
セットコンテナ
void main()
{
set<int> set1;
//循环插入
for(int i = 0;i < 3;i ++)
{
int tmp = rand() % 5;
set1.insert(tmp);
}
//遍历打印集合
for(set<int>::iterator it = set1.begin();it != set1.end(); it++)
{
cout<<*it<<endl;
}
//删除集合
while(!set1.empty())
{
set<int>::iterator item = set1.begin();
set1.erase(item);
}
return;
}
マップコンテナ
//元素的添加、遍历、删除等基本操作
void main()
{
//1、创建map对象
map<int, string> map1;
//方法1 添加元素 pair是一个有两个元素的结构体,方便使用,类似map :键值可以随意使用
//pair可以用来当做map的键值来插入 pair<T1,T2> p1 创建一个空的pair对象,有两个元素T1和T2,采用值初始化
map1.insert(pair<int, string>(1,"hehe"));
map1.insert(pair<int, string>(2,"xixi"));
//方法2 添加元素 make_pair
//make_pair
map1.insert(make_pair(3,"haha"));
map1.insert(make_pair(4,"huhu"));
//方法3 添加元素
map1.insert(map<int, string>::value_type(5,"kaka"));
map1.insert(map<int, string>::value_type(6,"yiyi"));
//方法4 数组方式插入数据
map1[7] = "yaya";
//容器遍历(迭代器)
for(map<int, string>::iterator it = map1.begin();it != map1.end(); it++)
{
cout<<it->first<<"\t"<<it->second <<endl;
}
cout<<"遍历结束"<<endl;
//容器的删除
while(!map1.empty())
{
map<int, string>::iterator it = map1.begin();
map1.erase(it);
}
//map查找
map<int, string>::iterator it1 = map1.find(2);
if(it1 != map1.end())
{
cout<<"不存在"<<endl;
}
else
{
cout<<it1->first<<"\t"<<it1->second<<endl;
}
}