zoukankan      html  css  js  c++  java
  • C++ 参数绑定bind1st, bind2nd

    std::bind
    之前这篇文章已经讲过C++ 参数绑定bind(适用于C++11以后),参见 C++ Primer学习笔记 - 参数绑定bind

    using namespace placeholders;
    // or using std::placeholders::_1;
    
    auto f = bind(f0, _1, 2); // 生成一个新的函数对象f,_1代表传给f的第一个实参,2是整型数字。这里_1和2的顺序,决定了f0调用时的参数排列顺序
    // 调用f(x)等价于
    f0(_1, 2);
    

    bind1st和bind2nd
    今天,我们讲一讲bind1st和bind2nd。两者在C++11中均已不推荐使用,C++17中已经移除。

    • 原型
    #include <functional>
    
    template< class F, class T >
    std::binder1st<F> bind1st( const F& f, const T& x );
    
    template< class F, class T >
    std::binder2nd<F> bind2nd( const F& f, const T& x );
    
    1. bind1st

    bind1st是绑定f的第一个参数到x:

    std::binder1st<F>(f, typename F::first_argument_type(x))
    // f是函数对象,x是实参
    

    也就是说,

    auto f = std::bind1st(less<int>(), 2);
    // 等价于
    auto f = std::bind(less<int>(), 2, _1);
    
    // 调用f(y),等价于调用
    less<int>()(2, y); // 返回 "2 < y" 比较结果
    
    1. bind2nd

    bind2nd是绑定f的第二个参数到x:

    std::binder2nd<F>(f, typename F::second_argument_type(x)).
    

    也就是说,

    auto f = std::bind2nd(less<int>(), 2);
    // 等价于
    auto f = std::bind(less<int>(), _1, 2);
    
    // 调用f(y),等价于调用
    less<int>()(y, 2); // 返回 "y < 2" 比较结果
    
    • 示例
      找到vector容器中,第一个小于2的元素,以及第一个大于2的元素
    vector<int> vec = {5,6,7,1,2,9,4,8,10,3};
    sort(vec.begin(), vec.end(), less<int>()); // 升序排序
    
    auto *p1 = find_if(vec.begin(), vec.end(), bind2nd(less<int>(), 2)); // ? < 2, 第一个小于2的元素
    cout << *p1 << endl; // 打印1
    auto *p2 = find_if(vec.begin(), vec.end(), bind1st(less<int>(), 2)); // 2 < ?, 第一个大于2的元素
    cout << *p2 << endl; // 打印3
    

    参见 std::bind1st, std::bind2nd | cppreference

  • 相关阅读:
    感谢一个名叫“祯玥”的姑娘
    下一代互联网
    伤心时要读的三十八句
    任何企业的竞争,归根结底都是智能的竞争
    互联网创业必须过的槛(转)
    钻到牛角尖里面去,想开公司必需知道的奥秘
    重游草堂
    牛根生:我们应该学会“三换思维”
    领导者的感染力和传染力
    幸福是一种心境(转)
  • 原文地址:https://www.cnblogs.com/fortunely/p/15741054.html
Copyright © 2011-2022 走看看