C++ 標準テンプレート ライブラリ (STL) - queue、priority_queue、stack、pair、algorithm ヘッダー ファイルの下で一般的に使用される関数


1. キュー

queue は、先入れ先出しの特性を持つキューです。キューを使用するには、#include<queue> を追加し、名前空間 std を使用する必要があります。

1. キューの定義:

queue<typename> name;//typename可以是任意基本数据类型或容器

キュー要素へのアクセス:
キュー自体は先入れ先出しの制限的なデータ構造であるため、STL が提供できるのは、キューの最初の要素にアクセスするためのfront() と、キューの末尾の要素にアクセスするための back() のみです。

#include<queue>
#include<stdio.h>
using namespace std;

int main(){
    queue<int> q;
    for(int i = 1 ; i <= 5 ; i++)
        q.push(i);
    printf("%d",q.front());//1
    return 0;
}

3. Push()
Push(x): x をキューに入れ、キューの最後に挿入します。

4. Pop() は
チームの最初の要素をデキューします。

#include<queue>
#include<stdio.h>
using namespace std;

int main(){
    queue<int> q;
    for(int i = 1 ; i <= 5 ; i++)
        q.push(i);
    for(int i = 1 ; i <= 3 ; i++)
        q.pop();
    printf("%d",q.front());//4
    return 0;
}

5. Empty()
はキューが空かどうかを検出し、空の場合は true を返し、そうでない場合は false を返します。

6. size() は
キュー内の要素の数を返します。

注:front() 関数と Pop() 関数を使用する前に、empty() 関数を使用してキューが空かどうかを判断する必要があります。そうしないと、エラーが発生する可能性があります。

二、優先キュー

プライオリティ キュー、基礎となる層はヒープで実装されます。プライオリティ キューでは、キューの先頭要素が現在のキュー内で最も高い優先度を持つ要素でなければなりません。使用する場合は、 #include<queue> を追加し、名前空間 std を使用します。

1. priority_queue の定義:

priority_queue<typename> name;

2. priority_queue コンテナ内の要素へのアクセス:
queue とは異なり、priority queue にはfront() 関数と back() 関数がなく、top() 関数を介してのみキューの最初の要素にアクセスできます。

#include<queue>
#include<stdio.h>
using namespace std;

int main(){
    priority_queue<int> q;
    q.push(3);
    q.push(4);
    q.push(1);
    printf("%d",q.top());//4
    return 0;
}

3. Push():
Push(x): x をキューに入れます

4. top():
チームの最初の要素を取得し、コンテナ内の要素へのアクセスを実現できます。

5.pop():
チームの最初の要素をデキューします。

6. empty():
キューが空かどうかを確認し、空の場合は true を返し、そうでない場合は false を返します。

7. size() は
優先キュー内の要素の数を返します。

8. 要素の優先順位の設定
(1) 基本データ型の優先順位の設定
int 型を例にとると、以下の 2 つの定義は等価です。

priority_queue<int> q;

priority_queue<int,vector<int>,less<int> > q;

2 番目の方法では、vector<int> は基礎となるデータ構造を保持するコンテナーであり、less<int> は最初のパラメーターの比較クラスです。less<int> は、大きい数値の優先順位が高く、より大きいことを意味します。< int > は数値が小さいほど優先度が高いことを示します

#include<queue>
#include<stdio.h>
using namespace std;

int main(){
    priority_queue<int,vector<int>,greater<int> > q;//数字小的优先级越大
    q.push(3);
    q.push(4);
    q.push(1);
    printf("%d",q.top());//1
    return 0;
}

(2) 構造の優先順位の設定
果物の名前と価格を含む構造を作成し、果物の高い価格を優先したい場合は、「<」記号の下をオーバーロードする必要があります。大なり記号をオーバーロードすると、コンパイル エラーが発生します。

struct fruit{
    string name;
    int price;
    friend bool operator < (fruit f1 , fruit f2){
        return f1.price < f2.price;
    }
};

注: プライオリティ キューでのこの関数の効果は、sort の cmp 関数の効果とは逆です。設定 f1.price<f2.price は小さい順に配置されますが、プライオリティ キューでの効果は、価格が高くなるということです。 、優先度が高くなります

例:価格の安い果物を優先

#include<queue>
#include<string>
#include<iostream>
using namespace std;

struct fruit{
    string name;
    int price;
    friend bool operator < (fruit f1 , fruit f2){
        return f1.price > f2.price;
    }
}f1,f2,f3;

int main(){
    priority_queue<fruit> q;
    f1.name = "桃子";
    f1.price = 3;
    f2.name = "梨子";
    f2.price = 4;
    f3.name = "苹果";
    f3.price = 1;
    q.push(f1);
    q.push(f2);
    q.push(f3);
    cout<<q.top().name<<" "<<q.top().price<<endl;
    return 0;
}

ここに画像の説明を挿入

**一般的な使用方法:** いくつかの貪欲な問題を解決でき、ダイクストラ アルゴリズムを最適化することもできます。

3、スタック

スタック: 後入れ先出しコンテナー。スタックを使用するには、 #include<stack> を追加し、 using namespace std を追加する必要があります。

1. スタックの定義:

stack<typename> name;

2. 要素へのアクセス:
スタックの最上位要素には、top() を介してのみアクセスできます。

3. Push():
Push(x): x をスタックにプッシュします

4. Pop()
Pop() は、スタックの最上位要素をポップするために使用されます。

#include<stdio.h>
#include<stack>
using namespace std;

int main(){
    stack<int> s;
    for(int i = 1 ; i <= 5 ; i++)
        s.push(i);
    for(int i = 1 ; i <=3 ; i++)
        s.pop();
    printf("%d",s.top());//2
    return 0;
}

5. Empty():
スタックが空かどうかを確認し、空の場合は true を返し、空でない場合は false を返します。

6. size():
スタック内の要素の数を返します。

4、ペア

2 つの要素を複合要素として結合したいが、構造体を定義したくない場合は、ペアを使用します。つまり、pair は実際には内部に 2 つの要素を含む構造とみなすことができます。ペアを使用する場合は、#include <utility> を追加し、namespace std を使用する必要があります。

1. ペアの定義:

pair<typename1,typename2> name;

如:
pair<string,int> p;

也可以定义的时候进行初始化:
pair<string,int> p("haha",5);

2. 要素アクセス:
ペアには 2 つの要素 (1 番目と 2 番目) だけがあります。

#include<utility>
#include<iostream>
#include<string>
using namespace std;

int main(){
    pair<string,int> p;
    p.first="haha";
    p.second=5;
    cout<<p.first<<" "<<p.second<<endl;
    p = make_pair("xixi",55);
    cout<<p.first<<" "<<p.second<<endl;
    p = pair<string,int>("heihie",555);
    cout<<p.first<<" "<<p.second<<endl;
    return 0;
}

3. 比較:
2 つのペア タイプは、==、!=、<、<=、>、>= によって比較できます。ルールは、最初に最初のサイズを基準として使用し、最初のペアが等しい場合にのみ、次に、2番目のサイズを判断します

一般的な用途:

  • バイナリ構造体とそのコンストラクタの代わりに使用されます
  • マップのキーと値のペアとして挿入
#include<utility>
#include<iostream>
#include<string>
#include<map>
using namespace std;

int main(){
   map<string,int> mp;
   mp.insert(make_pair("heihei",5));
   mp.insert(pair<string,int>("haha",10));
   for(map<string,int>::iterator it = mp.begin();it!=mp.end();it++){
    cout<<it->first<<" "<<it->second<<endl;
   }
   return 0;
}

ここに画像の説明を挿入

5. アルゴリズムヘッダーファイルでよく使用される関数

1、最大()、最小()、絶対値():

max(x,y)、min(x,y)は、x、yの最大値と最小値を返します。パラメーターは 2 つである必要があります。パラメーターが 3 つある場合は、max(x,max(y,z)) を使用できます。
abs(x) は x の絶対値を返します。x は整数でなければなりません。浮動小数点数の場合は、数学ヘッダー ファイルの下で fabs を使用してください。

2、スワップ():

swap(x,y) は、x と y の値を交換するために使用されます

3、リバース():

reverse(it,it2) は、[it,it2) の間の配列ポインタの要素、または [it,it2) の範囲内のコンテナ反復子の要素を反転できます。

#include<stdio.h>
#include<string>
#include<algorithm>
using namespace std;

int main(){
    string str = "abcdefghi";
    reverse(str.begin()+2,str.begin()+6);
    for(int i = 0 ; i < str.length() ; i++)
        printf("%c",str[i]);//abfedcghi
    return 0;
}

4、next_permutation():

完全な順列でシーケンスの次のシーケンスを与えます。
例: n=3 の場合の完全な置換

123
132
213
231
312
321
#include<stdio.h>
#include<algorithm>
using namespace std;

int main(){
    int a[10]={1,2,3};
    do{
        printf("%d%d%d\n",a[0],a[1],a[2]);
    }while(next_permutation(a,a+3));
    return 0;
}

ここに画像の説明を挿入
next_permutation は配列全体の最後に到達すると false を返します。これにより、ループを簡単に終了できます。

5、fill():

配列またはコンテナ内の特定の範囲を同じ値に割り当てることができます。memset とは異なり、ここでの割り当ては、配列型の対応する範囲内の任意の値にすることができます。

#include<stdio.h>
#include<algorithm>
using namespace std;

int main(){
    int a[5]={1,2,3,4,5};
    fill(a,a+5,233);
    for(int i = 0 ; i < 5 ; i++)
        printf("%d ",a[i]);
    return 0;
}

6、ソート():

は並べ替えに使用される関数です。

sort(首元素地址,尾元素地址的下一个地址,比较函数)

比較関数は必要に応じて記入できますが、記入しない場合、デフォルトで上記の範囲が昇順にソートされます。

例: char 配列を大きいものから小さいものへ (辞書順に) 並べ替えます。

#include<stdio.h>
#include<algorithm>
using namespace std;

bool cmp(char a , char b){
    return a>b;
}

int main(){
    char a[] = {'T','W','A','K'};
    sort(a,a+4,cmp);;
    for(int i = 0 ; i < 4 ; i++)
        printf("%c",a[i]);//WTKA
    return 0;
}

例: 構造体のソート定義の場合、x が等しくない場合は、x に従って大きいものから小さいものにソートされ、x が等しい場合は、y に従って小さいものから大きいものにソートされます。

#include<stdio.h>
#include<algorithm>
using namespace std;

struct node{
    int x,y;
}ssd[10];

bool cmp(node a , node b){
    if(a.x != b.x)
        return a.x > b.x;
    else
        return a.y < b.y;
}

int main(){
    ssd[0].x = 2;
    ssd[0].y = 2;
    ssd[1].x = 1;
    ssd[1].y = 3;
    ssd[2].x = 2;
    ssd[2].y = 1;
    sort(ssd,ssd+3,cmp);
    for(int i = 0 ; i < 3 ; i++)
        printf("%d %d\n",ssd[i].x,ssd[i].y);
    return 0;
}
// 2 1
// 2 2
// 1 3

コンテナの並べ替え: STL では、set や map などのコンテナは本質的に順序付けされているため、sort を使用できるのは、vector、string、および deque のみです。

#include<stdio.h>
#include<vector>
#include<algorithm>
using namespace std;

bool cmp(int a , int b){
    return a>b;
}

int main(){
    vector<int> vi;
    vi.push_back(3);
    vi.push_back(1);
    vi.push_back(2);
    sort(vi.begin(),vi.end(),cmp);
    for(int i = 0 ; i < 3 ; i++)
        printf("%d ",vi[i]);
    return 0;
}

7、下限()、上限()

順序付けられた配列またはコンテナーで使用する必要があります。
lower_bound(first, last, val) は、配列またはコンテナの [first, last) 範囲内で値が val 以上である最初の要素の位置を検索します。それが配列の場合は、そのポインタを返します。位置 (コンテナーの場合) は、位置イテレーター
upper_bound(first, last, val) は、配列またはコンテナーの [first, last) 範囲内で、値が val より大きい最初の要素の位置を見つけます。配列の場合はその位置のポインタを返します コンテナの場合はその位置へのイテレータを返します
見つからない場合は要素を挿入できる位置へのポインタまたはイテレータを返します

#include<stdio.h>
#include<algorithm>
using namespace std;

int main(){
    int a[10] = {1,2,2,3,3,3,5,5,5,5};
    //寻找-1
    int* lowerPos = lower_bound(a,a+10,-1);
    int* upperPos = upper_bound(a,a+10,-1);
    printf("%d,%d\n",lowerPos-a,upperPos-a);//0,0

    //寻找3
    lowerPos = lower_bound(a,a+10,3);
    upperPos = upper_bound(a,a+10,3);
    printf("%d,%d\n",lowerPos-a,upperPos-a);//3,6

    return 0
}

おすすめ

転載: blog.csdn.net/weixin_46025531/article/details/122799564