C++for_each| bind1st | ptr_fun | std::function的用法

53 篇文章 1 订阅
31 篇文章 2 订阅

c++ for_each 用法_小键233-CSDN博客

传入参数

  • 要传入参数给global function ,需要使用 ptr_fun() 这个 function adapter 将global function 转成function object , 然后再用bind2nd() 将参数bind成一个function object。(这句话好拗口)
void fun(int i, const char* str)
{
    cout<<str<<i<<endl;
}

int main()
{
    int a[] = { 1, 2, 3, 4};
    vector<int> v(a, a+sizeof(a)/sizeof(int));
    for_each(v.begin(), v.end(), bind2nd(ptr_fun(fun), "Element:"));
}
#include <iostream>
#include <vector>

template<class T>
struct plus2{
    void operator()(T& x){
        x += 2;
    }
};

//template <class T>
void plus3_fun(int& x){
    x += 3;
//    std::cout << x << " ";
}

void fun(int i,const char* str){
    std::cout << str << "->" << i << std::endl;
}

int main(){
//    int ia[] = {22,30,20,34,45,64,34,56,75,34};
//    std::vector<int>iv(ia,ia+(sizeof (ia) / sizeof (int)));
//    for (int i : iv) {
//        std::cout << i << ' ';
//    }
//    std::cout << std::endl;
//    std::cout << iv.size() << ' ';
//    std::cout << std::endl;
//
    std::for_each(iv.begin(),iv.end(),plus2<int>());
//    std::for_each(iv.begin(),iv.end(), std::bind2nd(std::ptr_fun(fun),"Hello world"));
//    for (int i : iv) {
//        std::cout << i << ' ';
//    }

    int ia[] = {1,2,100,200};
    std::vector<int>arr(ia,ia+(sizeof (ia)/sizeof (int)));
    //移除所有小于100的元素
    //bind2nd(判断条件,标准)  判断条件 标准
    //bind1nd(判断条件,标准)  标准 判断条件
    /*
     * std::bind1nd(std::less<int>(),100))   100 < x
     * std::bind2nd(std::less<int>(),100))   x < 100
     */
//    arr.erase(std::remove_if(arr.begin(),arr.end(),std::bind2nd(std::less<int>(),100)),arr.end()); //100 200
//    arr.erase(std::remove_if(arr.begin(),arr.end(),std::bind1st(std::greater<int>(),100)),arr.end());

//    arr.erase(std::remove_if(arr.begin(),arr.end(),std::bind2nd(std::greater<int>(),100)),arr.end());
//    arr.erase(std::remove_if(arr.begin(),arr.end(),std::bind1st(std::less<int>(),100)),arr.end()); //1 2 100

    //删除小于等于100的元素
    arr.erase(std::remove_if(arr.begin(),arr.end(),std::not1(std::bind2nd(std::greater<int>(),100))),arr.end());

    for(auto i : arr){
        std::cout << i << " ";
    }
}

ptr_fun

  • C++11弃用 被更通用的std::function 和 std::ref替代
#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>

bool isvowel(char c){
    return std::string("aeiouAEIOU").find(c) != std::string::npos;
}

int main(){
    std::string s = "Hello world!";
    std::copy_if(s.begin(),s.end(),std::ostreambuf_iterator<char>(std::cout),
            std::not1(std::ptr_fun(isvowel)));
}

//Hll wrld!

std::function函数

#include <iostream>
#include <vector>
#include <functional>
#include <algorithm>

struct Foo{
    Foo(int num):num_(num){};
    void print_add(int i)const {
        std::cout << num_ + i << std::endl;
    }
    int num_;
};
void print_num(int i){
    std::cout << i << '\n';
}
struct print_Num{
    void operator()(int i){
        std::cout << i << '\n';
    }
};


int main(){
    //store a free function
    std::function<void(int)>f_display = print_num;
    f_display(-9);

    //strore a lambda
    std::function<void()> f_display_42 = [](){ print_num(43);};
    f_display_42();

    //store the result of a call to std::bind
    std::function<void()>f_display_31337 = std::bind(print_num,31337);
    f_display_31337();

    //store a call to a member function
    std::function<void(const Foo&,int)>f_add_display = &Foo::print_add;
    const Foo foo(300000);
    f_add_display(foo,1);

    //store a call to a member function and object
    using std::placeholders::_1;
    std::function<void(int)>f_add_display2 = std::bind(&Foo::print_add,foo,_1);
    f_add_display2(2);

    //store a call to a member function and object ptr
    std::function<void(int)>f_add_display3 = std::bind(&Foo::print_add,&foo,_1);
    f_add_display3(3);

    //store a call to a function object
    std::function<void(int)>f_display_obj = print_Num();
    f_display_obj(18);
}

参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值