zoukankan      html  css  js  c++  java
  • 【足迹C++primer】32、定制操作_1

    版权声明:本文为博主原创文章,未经博主同意不得转载。

    https://blog.csdn.net/cutter_point/article/details/32066151

    定制操作

    向算法传递函数

    用 sort 接受第三个參数!!

    谓词

    bool isShorter(const string &s1, const string &s2)
    {
        return s1.size()<s2.size();
    }
    
    int main()
    {
        //按长度由短至长排序words
        sort(words.begin(), words.end(), isShorter);
    }

    这个words里面是一个string类型的数组,这个调用会是将words重排,全部长度为3的单词排在长度为4的前面,然后是长度为5的单词。


    排序算法

    看来排序非常重要啊!

    近期老碰到排序。冒泡排序什么的已经非常熟悉啦,大笑选择排序不太清楚,什么二分啦,快排啦,哈希啦。就仅仅是知道思路,得努力啊!


        vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
        //按长度由短至长排序words
        sort(words.begin(), words.end(), isShorter);
        elimDups(words);    //将words按字典序重排,并消除反复单词
        //按长度重排。长度一样按字典
        stable_sort(words.begin(), words.end(), isShorter);
    
        for(const auto &s : words)  //无需拷贝字符串
            cout<<s<<" ";   //打印每一个元素
        cout<<endl;

    习题:
    //调用算法进行排序打印长度大于5的元素
        auto it=partition(words.begin(), words.end(), isLong);
        //返回的是使谓词为true的最后一个迭代器
        cout<<"输出长度大于等于5的字符!

    "<<endl; for(vector<string>::iterator st=words.begin() ; st != it ; ++st) cout<<*st<<" "; cout<<endl;



    lambda表达式

    要是没次要输出大于几就改有点麻烦是吧,那就把谓词给它来个百八十个!

    !!


    获取一个迭代器,指向第一个满足size()>=sz的元素
    计算满足size>=sz的元素的数目
    打印长度大于给定值的单词,每一个单词后面接一个空格

    这里能够用find_if。嘿嘿!

    又来了好东西了。大家是不是感觉幸福来的太突然!!!

    吐舌头


    find_if接受一对迭代器,表示一个范围,查找有特定大小的元素。


    但是啊,这里find_if每次也仅仅能接受一个參数,没法接受一个序列!

    大哭


    这么办呢???

    介绍lambda

    眼下就两种可调用对象。各自是:函数、函数指针!!。函数指针是干嘛的?

    事实上还有两种:重载了函数调用运算符的类,和 嘿嘿,又来了,每次揭晓答案的时候总是忍不住调皮一下大笑

    那就是:lambda表达式

    [capture list] (parameter list)  -> return type{function body}

    诺,这就是那玩意的表现形式。

    //是不是有点不一样。这里定义了可调用对象f,它不接受參数。返回42
    auto f=[] {return 42;};

        //看哥调用它
        cout<<f()<<endl;

    这里假设lambda的函数体包括不论什么单一return语句之外的内容、且为指定返回类型。则返回void类型


    向lambda传递參数,使用捕获列表

    stable_sort(words.begin(), words.end(), [] (const string &a, const string &b)
    {return a.size()<b.size();})

    void fcn1()
    {
        vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
        size_t v1 = 42;
        //获取一个迭代器,指向第一个满足size()>=v1的元素
        auto wc=find_if(words.begin(), words.end(), [v1](const string &a){return a.size()>=v1;});
    
    }

    void fcn2()
    {
        vector<string> words={"fox","jumps","over","quick","red","red","slow","the","the","turtle"};
        size_t v1 = 42;
        //获取一个迭代器。指向第一个满足size()>=v1的元素
        auto wc=find_if(words.begin(), words.end(), [v1](const string &a){return a.size()>=v1;});
        //计算满足size>=sz的元素的数目
        auto count=words.end()-wc;
        
        cout<<count<<" "<<make_plural(count, "word", "s")
            <<" of length "<<v1<<" or longer "<<endl;
            
        //for_each算法
        for_each(wc, words.end(),[](const string &s){cout<<s<<" yeah! ";});
    }
    


















查看全文
  • 相关阅读:
    C#调用自定义表类型参数
    不同版本SQL SERVER备份还原时造成索引被禁用
    SQL SERVER同步环境新增发布对象时不能生成(sp_MS+表名)同步存储过程
    C# 读取在存储过程多结果集
    C#读取XML文件
    批量还原V2
    tmux 常用快捷键
    无法生成SSPI上下文
    sql server 性能计数器
    sql server 2008 r2 xevent
  • 原文地址:https://www.cnblogs.com/ldxsuanfa/p/10577392.html
  • Copyright © 2011-2022 走看看