【通俗易懂C++ STL模板库】find_if()、plus,for_each()

STL算法--find_if()

#include<iostream>

#include<vector>

#include<algorithm>

#include<functional>

using namespace std;

template<typename Type>

class IsDiv{

    public:

        IsDiv(const Type &divisor){

            this->divisor = divisor;

        }   

        bool operator()(Type &t){

            return t%divisor == 0;

        }   

    protected:

    private:

        Type divisor;

};

int main(void){

    vector<int> v2; 

    for(int i = 10; i < 33; i++){

        v2.push_back(i);

    }   

    int a = 4;

    IsDiv<int> myDiv(a);

    //find_if(v2.begin(), v2.end(), myDiv);

    vector<int>::iterator it;

    it =find_if(v2.begin(), v2.end(), IsDiv<int>(a) );

    if(it == v2.end()){

        cout<<"容器中没有值是4的元素"<<endl;

    }else{

        cout<<"第一个被4整除的元素是:"<<*it<<endl;

    }

    return 0;

STL算法--plus的使用

#include<iostream>

#include<vector>

#include<algorithm>

#include<functional>

using namespace std;

//plus 预定义好的函数对象,能实现不同数据 + 算法;

//实现了数据类型和算法的分离======》通过函数对象技术实现的;

//

//思考,怎么知道plus<type>是2个参数------>多看看源码;

void main21(){

    plus<int> intAdd;

    int x = 10;

    int y = 20;

    int z = intAdd(x, y);

    cout<<"z:"<<z<<endl;

    plus<string> stringAdd;

    string s1 = "aaa";

    string s2 = "bbb";

    string s3 = stringAdd(s1, s2);

    cout<<"s3:"<<s3<<endl;

    vector<string> v1;

    v1.push_back("bbb");

    v1.push_back("aaa");

    v1.push_back("ccc");

    v1.push_back("zzz");

    v1.push_back("ccc");

    v1.push_back("ccc");

    sort(v1.begin(), v1.end(), greater<string>()); //降序排列;

    vector<string>::iterator it;

    for(it = v1.begin(); it != v1.end(); it++){

        cout<<*it<<endl;

    }

    //求“ccc”出现的字符串的个数;

    string sc = "ccc"; //函数适配器:将函数和参数强行绑定;

    //equal_to<string>有2个参数,left参数来自容器,right参数来自sc,

    //bind2nd就是函数适配器:把预定义函数对象和第二个参数进行绑定;`

    int num = count_if(v1.begin(), v1.end(), bind2nd(equal_to<string>(), sc));

    cout<<"num:"<<num<<endl;

}

int main(void){

    main21();

    return 0;

}

STL算法--for_each()

#include<iostream>

#include<vector>

#include<algorithm>

#include<functional>

using namespace std;

void printV(vector<int> &v){

    vector<int>::iterator it;

    for(it = v.begin(); it != v.end(); it++){

        cout<<*it<<" ";

    }

    cout<<endl;

}

void showElem(int &n){

    cout<<n<<" ";

}

class MyShow{

    public:

        MyShow(){

            num = 0;

        }

    void operator()(int &n){

        num++;

        cout<<n<<" ";

    }

    void printNum(){

        cout<<"num :"<<num<<endl;

    }

    private:

        int num;

};

int main(void){

    vector<int> v1;

    v1.push_back(1);

    v1.push_back(3);

    v1.push_back(5);

    printV(v1);

    //第三个参数是:函数对象/回掉函数

    //for_each(v1.begin(), v1.end(), showElem);  //利用的是回调函数 

    for_each(v1.begin(), v1.end(), MyShow()); //利用的是函数对象(这个类中重载了())

    //函数的返回值是函数对象

    cout<<endl;    

    MyShow my1 = for_each(v1.begin(), v1.end(), MyShow()); //利用的是函数对象(这个类中重载了())

    my1.printNum();

    return 0;

    } 

for_each()和transform()的区别

#include<iostream>

#include<vector>

#include<algorithm>

#include<functional>

using namespace std;

void showElem(int &n){

    cout<<n<<" ";

int showElem2(int &n){

    cout<<n<<" ";

    return n;

//for_each和transform的本质区别:

//结论:

//1、一般情况下,for_each所使用的函数对象,参数是引用,没有返回值;

//2、transform所使用的函数对象,参数一般不使用引用,而是还有返回值;

int main(void){

    vector<int> v1; 

    v1.push_back(1);

    v1.push_back(3);

    v1.push_back(5);


    vector<int> v2 = v1; 

    for_each(v1.begin(), v1.end(), showElem);

    transform(v2.begin(), v2.end(), v2.begin(), showElem2);//transform对回调函数的要求;返回值必须有

    cout<<endl;

    return 0;

}


如果喜欢欢迎关注   编程小兔崽

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 容器 在实际的开发过程中, 数据结构本身的重要性不会逊于操作于数据结构的算法的重要性, 当程序中存在着对时间要求很...
    编程小兔崽阅读 1,107评论 0 1
  • 各校历年复试机试试题 清华、北大、华科试题详细笔记部分,少笔记部分与少数leetcode【含个人整理笔记】 一、详...
    十里江城阅读 1,205评论 0 1
  • C++基础 模板及标准模板库 模板的作用模板使程序员能够快速的建立具有类型安全得库集合和函数集合,它的实现,方便了...
    I踏雪寻梅阅读 523评论 0 4
  • 前言: 详细介绍: List:元素有放入顺序,元素可重复Map:元素按键值对存储,无放入顺序Set:元素无放入顺序...
    YBshone阅读 8,707评论 0 17
  • 有风,把太阳吹得很低。 风大,把光线吹得很弱。 风的温暖与柔软,就是把夏天的太阳与光线变得柔和与娇弱。云很卷,就像...
    龙青阅读 327评论 0 1