C++:08.泛型算法、仿函數(函數對象)、bind1st 與 bind2nd

置頂推薦轉載引用的博文(講解的很詳細):https://www.cnblogs.com/ne-liqian/p/7889631.html       

泛型算法:

泛型算法是STL庫裏面定義的一些算法,這些算法可以用一個接口操作各種數據類型,因此成爲泛型算法。

泛型算法只依賴於迭代器的操作,而不是依賴於容器。

頭文件:#include <algorithm>   和   #include <numeric>。

 常用泛型算法:

1、find(begin,end,value);

查找算法。begin到end是查找範圍的迭代器,value是要找的值,返回值是第一個等於給定值的迭代器,找不到,則返回end。

int main()
{
    int target = 1;
    vector<int> vec;

    int array[4] = {1,2,3,4};

    vec.push_back(1);
    vec.push_back(2);
    vec.push_back(3);

    if(find(vec.begin(), vec.end(), target) == vec.end())
        printf("not find\n");
    else
        printf("find\n");

    //查找一個數組
    if(find(&array[0], &array[3], target) == &array[3])
        printf("not find\n");
    else
        printf("find\n");
}

2、find_if(begin, end, pred)

find_if(begin, end, pred):查找算法。帶自定義查找函數(第三個參數)。意思就是對begin到end上面每一個元素判斷 pred (*iter) == true,則表示找到返回當前迭代器,找不到則返回end。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

bool isequal6(const int &v1)
{
    return (v1 == 6);
}

class isequal5
{  
public:   
    bool operator () (int& target) 
    {  
        return (target == 5);  
    }  
}; 

class isequal
{  
public:   
    isequal(int value):m_value(value){}
    bool operator () (int& target) 
    {  
        return (target == m_value);  
    }  

    int m_value;
}; 

int main()
{
    vector<int> vec1;

    vec1.push_back(1);
    vec1.push_back(5);
    vec1.push_back(6);
    
    使用自定義函數isequal6(參數時容器中使用迭代器遍歷的每個元素)
    if(find_if(vec1.begin(), vec1.end(), isequal6() != vec1.end()))      
        printf("find\n");
    else
        printf("not find.\n");
    
    所謂的仿函數就是函數對象(類中有()運算符重載函數,此時該類定義的對象就可以當函數使用,函數使用的時候不就需要用()麼)
    if(find_if(vec1.begin(), vec1.end(), isequal5() != vec1.end()))    //使用仿函數
        printf("find\n");
    else
        printf("not find.\n");

    if(find_if(vec1.begin(), vec1.end(), isequal(7) != vec1.end()))    //使用帶參數的構造函數仿函數
        printf("find\n");
    else
        printf("not find.\n");

    return 0;
}

仿函數(函數對象):上面代碼中提及。怕你看不見標紅了。

介紹find_if那就順帶介紹一下綁定器bind1st  與  bind2nd

bind1st  : 綁定二元函數對象operator()的第一個參數

bind2nd  :綁定二元函數對象operator()的第二個參數

vector<int> vec = {1, 2, 2, 3, 4};
 
pos1 = find_if(vec.begin(), vec.end(), bind1st(less<int>(), 2));
cout << *pos1 << endl;
輸出3    less<int>() 就是'<'二元操作  bind1st綁定第一個元素,可以理解爲哦綁定在左邊 2 < ?
         該函數的意思就是查找第一個比2大的元素


pos2 = find_if(vec.begin(), vec.end(), bind2nd(greater<int>(), 2));
cout << *pos2 << endl;
輸出3    greater<int>() 就是'>'二元操作  bind2nd綁定第二個元素,可以理解爲哦綁定在右邊 ? > 2
         該函數的意思也是查找第一個比2大的元素

3、accumulate(begin,end,init_value)

求和算法。begin到end是求和範圍的迭代器,init_value是求和的初值。意思就是求前面範圍的和,最後加上init_value。

4、sort(begin,end)

排序算法。這個就是排序,另外可以有第三個參數,傳入自定義的比較函數,另外也可以傳入stl自帶的比較函數模板。

把vec裏面的元素按從大到小的序列進行排序
sort(vec.begin(), vec.end(), greater<int>());
	
默認排序方式:小到大
sort(vec.begin(), vec.end());
sort(vec.begin(), vec.end(),less<int>());

還有很多算法,這裏就不一一介紹了。

想看點擊:https://www.2cto.com/kf/201606/517445.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章