find_if(),plus,for_each()的用法

1、STL算法--find_if()

(1)、代码如下:

#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;
}

(2)、运行结果:

2、STL算法--plus的使用

(1)、代码如下:

#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;
}

(2)、运行结果:

3、STL算法--for_each()

(1)、代码如下:

#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;
}

(2)、运行结果:

4、for_each()和transform()的区别

(1)、代码如下:

#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;
}

运行结果:

时间: 2024-11-08 18:17:26

find_if(),plus,for_each()的用法的相关文章

STL中mem_fun, mem_fun_ref用法

1.引言 先看一个STL中for_each的用法: 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <functional> 5 #include <iterator> 6 using namespace std; 7 class Test 8 { 9 public: 10 Test(int _data = 0):data(_data){} 1

STL常用遍历算法for_each和transform的比较

for_each()和transform()算法比较 1)STL 算法 – 修改性算法 for_each() copy() copy_backward() transform() merge() swap_ranges() fill() fill_n() generate() generate_n() replace replace_if() replace_copy() replace_copy_if() 2) for_each() 速度快 不灵活 transform() 速度慢 非常灵活 一

STL algorithm算法详解

选一些感觉实用的写一下 count()    返回等价于给定值的元素个数 count_if()    返回满足条件的冤死个数 find() find_if() find_if_not() for_each() min_element(Iterator begin , Iterator end)min_element(Iterator begin , Iterator end , compFunc op)max_element(Iterator begin , Iterator end)max_e

c++ primer 5th 笔记:第十章

第十章:泛型算法 笔记 1. 标准库并未给每个容器添加大量功能,而是提供了一组算法,这些算法(通用的)中的大多数都独立于任何特定的容器. 2. 大多数算法都定义在头文件algorithm中,另外在头文件numeric中定义了一组数值泛型算法. 3. 保证算法有足够的元素空间开容纳输出数据的方法是使用插入迭代器,back_inserter接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器: vector<int> vec; // 空向量 auto it = back_inserter(ve

泛型2(lambda表达式/参数绑定)

lambda 表达式: Lambda表达式完整的声明格式如下: [capture list] (params list) mutable exception-> return type { function body } 各项具体含义如下: capture list:捕获外部变量列表 params list:形参列表 mutable 指示符:用来说用是否可以修改捕获的变量 exception:异常设定 return type:返回类型 function body:函数体 我们这里先不讨论 exc

STL算法find,find_if,find_if_not,sort,fill,for_each,count,adjacent_find,random_shuffle,prev_permutation

 1find查找 #include<iostream> #include<vector> #include<algorithm> #include<list> #include<set> #include<string> usingnamespacestd; voidmain() { vector<int>myv; myv.push_back(1); myv.push_back(2); myv.push_back(3)

匿名函数和for_each用法

匿名函数,C++11的 for_each 用法 #include <iostream> #include <algorithm> #include "testClassA.h" using namespace std; void tiwce(int& elem) { elem = elem * 2; } // 不带参数,不带返回值 // [](){cout << 123 << ","; }; // []{cou

for_each用法

for_each()是个function template #include <algorithm>头文件说明 template<class _InIt, class _Fn1> inline void _For_each(_InIt _First, _InIt _Last, _Fn1& _Func) { // perform function for each element for (; _First != _Last; ++_First) _Func(*_First)

c++11的for新用法 (重新练习一下for_each)

看到手册的代码里面有个for的很奇怪的用法,用了一把    http://www.cplusplus.com/reference/unordered_set/unordered_set/insert/ 编译  g++ -o test main.cpp -std=c++11