C++中汎用アルゴリズム


前のブログでは、いくつかの標準ライブラリコンテナを簡単に紹介していますが、標準ライブラリの各コンテナの操作関数が特に少ないと感じているに違いありません.の一方、標準ライブラリは、各コンテナに多くの操作関数を個別に定義するのではなく、共通の関数の山を提供して一緒に使用します.
1.汎用アルゴリズムの概要
C++のほとんどのアルゴリズムはヘッダファイルalgorithmに定義されています.もちろん、ヘッダファイルnumericで数値汎用アルゴリズムのセットが定義されています.通常、これらのアルゴリズムはコンテナを直接操作するのではなく、2つの反復器で指定された要素範囲を巡って操作します(したがって、これらのアルゴリズムは一般的にコンテナのサイズを変更しません).
2.読み取り専用アルゴリズム
このようなアルゴリズムは、反復範囲のロシア要素のみを読み取り、要素(1)find関数を変更しません.この関数の機能は、指定された要素find関数の前のパラメータが反復範囲であり、3番目のパラメータが検索する値であり、その要素の反復値を返します.失敗した場合は、次のような末尾反復器の具体的な例を返します.
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,4,5
    };

    auto it = find(v.begin(),v.end(),3);

    if(it == v.end())
    {
        cout<<"      "<<endl;
    }
    else
    {
        cout<<"     "<<endl;
    }


    return 0;
}

(2)count関数この関数の機能は、指定された範囲内の等しい要素の個数を見つけるためであり、その前のパラメータは一対の反復器範囲であり、3番目の要素は等しいと判断する要素の具体的な例は以下の通りである.
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,3,3,4,5,6
    };

    int n = count(v.begin(),v.end(),3);

    cout<<"n = "<<n<<endl;
    return 0;

}

(3)accumulate関数この関数は、与えられた範囲のすべての要素の合計の最初の2つのパラメータが1対の反復器範囲であり、3番目のパラメータが和の初期値の具体的な例は以下の通りである.
#include<iostream>
#include<vector>
#include<numeric>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,4,5
    };

    int sum = accumulate(v.begin(),v.end(),0);

    cout<<"sum" <<sum<<endl;
    return 0;

}

3.書き込みコンテナ要素のアルゴリズム
(1)fill関数この関数の機能は、与えられた範囲内の要素値を別の値に変換する前の2つのパラメータが1対の反復器であり、3番目のパラメータが置換された値である具体的な例は以下の通りである.
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,4,5
    };

    fill(v.begin(),v.end(),9);

    for(auto x:v)
    {
        cout<<x<<" ";

    }
    cout<<endl;

    return 0;
}

(2)back_Inserterこの関数は、コンテナにデータを挿入するための挿入反復器を返します.そのパラメータは反復器の参照の具体例です.
#include<iostream>
#include<vector>
#include<iterator>

using namespace std;
int main(void)
{
    vector<int> v;

    //          
    auto it = back_inserter(v);
    *it = 5;
    *it = 7;

    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    return 0;
}

(3)copy関数この関数の機能は、ソース反復器の内容を別の宛先に書き込む前の2つのパラメータが反復器範囲であり、3番目のパラメータが宛先反復器の具体例は以下の通りである.
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v(5,10);

    vector<int> v1(5);

    copy(v.begin(),v.end(),v1.begin());

    for(auto x:v1)
    {
        cout<<x<<" ";
    }

    cout<<endl;

    return 0;
}

(4)replace関数この関数の機能は、ある反復器の範囲内の要素のうち、ある値に等しい要素を別の値の最初の2つのパラメータに置き換えて1対の反復器、3番目のパラメータは探している要素の値、4番目のパラメータは置換された値の具体的な例である.
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        1,2,3,3,3,3,4
    };

    replace(v.begin(),v.end(),3,8);

    for(auto x:v)
    {
        cout<<x<<" ";
    }

    cout<<endl;

    return 0;
}

(5)sortとunique関数sort関数の機能は、指定された範囲内の要素をソート(デフォルト昇順)し、unique関数の機能は、ソート範囲内の要素の中で重複する要素を重複しない要素に配置した後、この2つの関数のパラメータは、いずれも1対の反復器具体であり、例えば、下
#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
int main(void)
{
    vector<int> v = {
        3,1,5,7,6,3,3,3
    };

    sort(v.begin(),v.end());

    //       
    cout<<"       :";
    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    //  unique  
    auto end_it = unique(v.begin(),v.end());
    cout<<"  unique     :";
    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    //    end_it          
    v.erase(end_it,v.end());

    cout<<"       ";
    for(auto x:v)
    {
        cout<<x<<" ";
    }
    cout<<endl;

    return 0;
}