【通俗易懂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;

}


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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

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