標準テンプレートライブラリとSTLアルゴリズム
ジェネリック:これ
は、標準テンプレートライブラリのコアアイデアです。いわゆるジェネリックとは、オブジェクトが属するデータ型からオブジェクトが分離されていることを意味します。
STLは汎用ライブラリです。
そのすべてのコンポーネントはテンプレートで構成されており、その要素は任意のタイプにすることができます。
C ++標準ライブラリは、
(1)汎用アルゴリズム、
(2)汎用コンテナ、
(3)汎用イテレータ、
(4)関数オブジェクト、
(5)アダプタ、
(6)アロケータの6つの主要コンポーネントで構成されています。
1.コンテナ:特定のタイプのオブジェクトのコレクションを管理します
。2。イテレータ:オブジェクトのコレクションをトラバースし
ます。3。アルゴリズム:コレクション内の要素を処理するためのアルゴリズムを提供します。C++標準、STLは13個のヘッダーファイルで構成されています。
1つはSTLアルゴリズム
STLは、関数テンプレートを使用して、70を超える一般的に使用されるアルゴリズムを定義します。アルゴリズムは主に、に含まれ、
一般的に使用されます
。1。ソート
コード:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[]={
2,5,8,6,8,5,55,88,8};
int len=(sizeof(a)/sizeof(*a));
sort(a,a+len);
for(int i=0;i<len;i++){
cout<<a[i]<<' ';
}
return 0;
}
拡張機能(並べ替えは非常に便利です。並べ替え(a、a + n)はデフォルトで小さいものから大きいものへの並べ替えです。必要に応じて大きいものから小さいものへと並べ替えることもでき、構造を並べ替えることもできます);
コード:
//使用sort实现结构体排序
#include<iostream>
#include<algorithm>
using namespace std;
struct Point{
int x;
int y;
}p[4];
bool cmp(Point p1,Point p2){
if(p1.x==p2.x){
return p1.y<p2.y;
}else{
return p1.x<p2.x;
}
}
int main(){
for(int i=0;i<4;i++){
cin>>p[i].x;
cin>>p[i].y;
}
sort(p,p+4,cmp);
for(int i=0;i<4;i++){
cout<<"("<<p[i].x<<","<<p[i].y<<")"<<endl;
}
return 0;
}
次に、カウント(開始点から終了点までキーが表示される回数を返します)
コード:
#include<algorithm>
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
string str("one world one dream");
char key='e';
n=count(str.begin(),str.end(),key);
cout<<"key count:"<<n<<endl;
return 0;
}
3つ、他のアルゴリズム
第二に、コンテナ
STLコンテナは、さまざまなタイプのデータを格納および保持するために使用され、クラステンプレートとして実装されます。
STLコンテナは3つのカテゴリに分類されます:
1)シーケンシャルコンテナ;
2)アソシアティブコンテナ;
3)コンテナアダプタ;
1。シーケンシャルコンテナ;
1、ベクトル(ベクトル):継続的に格納される要素;
2、リスト(リスト):ノードごと2つ-ウェイリンクリストが構成され、各ノードには1つが含まれます;
3つ、deque:連続的に格納された異なる要素へのポインタの配列;
2。連想コンテナ:
1つ、セット:同じ要素を持つことはできません;
2つ、複数のセット(meltiset):同じ要素を持つことができます;
3、マップ(マップ):{キー、値}で構成されるセット;
3.コンテナアダプター:
1、スタック(スタック):ファーストインラストアウト
2、キュー(キュー):ファーストインファーストアウト
3.優先度キュー(priority_queue):優先度の高い方が先頭になります。
注:
ベクターの使用例:
コード:
#include<vector>
#include<iostream>
using namespace std;
int main(){
vector <int> vi;
int a;
while(true){
cout<<"输入一个整数,按0停止"<<endl;
cin>>a;
if(a==0)break;
vi.push_back(a);
}
for(int i=0;i<vi.size();i++){
cout<<vi[i]<<" ";
}
return 0;
}
ベクトル
の要素にアクセスするためのベクトルを作成し、ベクトル
関数の逆の順序とコピーを挿入または削除します
。
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[6]={
1,25,25,88,11,2};
vector<int> v1(arr,arr+6),v2;//v1的初始化
v2.resize(6);//发配大小
copy(v1.begin(),v1.end(),v2.begin());//复制函数
reverse(v2.begin(),v2.end());//逆序函数
for(int i=0;i<v2.size();i++){
cout<<v2[i]<<" ";
}
return 0;
}
3、イテレータ
イテレータはカプセル化された高レベルポインタです。ユーザーはオブジェクトのデータ型を気にせずにコンテナまたはシーケンスをトラバースできます。
イテレータはヘッダーファイルにあります:、、
イテレータトラバーサルプロセス:
begin()およびend():
イテレータはインスタンスをトラバースします。
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int arr[6]={
1,25,25,88,11,2};
vector<int> v1(arr,arr+6);
for(vector<int>::iterator it=v1.begin();it!=v1.end();it++){
cout<<*it<<' ';
}
return 0;
}
高度な演習:(2つのリンクリストを順番にマージする)
input_case:
3 3
-1 22 8
9 -88 2
output_case:
-88 -1 2 8 9 22
コード:
#include<iostream>
#include<list>
using namespace std;
int main(){
list<int> l1,l2;
int len_1,len_2;//两个链表的长度
scanf("%d %d",&len_1,&len_2);
int num;
for(int i=0;i<len_1;i++){
cin>>num;
l1.push_back(num);//加入链表
}
for(int i=0;i<len_2;i++){
cin>>num;
l2.push_back(num);//加入链表
}
l1.sort();//表1排序
l2.sort();//表2排序
l1.merge(l2);//l2归并到l1中
for(list<int>::iterator it=l1.begin();it!=l1.end();it++){
//迭代器遍历
cout<<*it<<' ';
}
return 0;
}
イテレータタイプ:
異なるコンテナがイテレータをサポートするかどうか:
注:イテレータは、ベクトルなどの添え字(ランダムアクセスをサポートするものにのみ適用可能)を介して割り当てることもできますが、リストは割り当てられません