`

bind2nd bind1st

阅读更多
Apache C++ Standard Library Reference Guide

bind1st(), bind2nd(), binder1st, binder2nd

Library:   General utilities


Function

Local Index

No Entries

Summary

Templatized utilities to bind values to function objects

Synopsis

#include <functional>

namespace std {
  template <class Operation>
  class binder1st;
  
  template <class Operation, class T>
  binder1st<Operation> bind1st(const Operation&, const T&);

  template <class Operation>
  class binder2nd ;

  template <class Operation, class T>
  binder2nd<Operation> bind2nd(const Operation&, const T&);
}

Description

Because so many functions included in the C++ Standard Library take other functions as arguments, the library includes classes that let you build new function objects out of old ones. Both bind1st() and bind2nd() are functions that take as arguments a binary function object f and a value x, and return, respectively, classes binder1st and binder2nd . The underlying function object must be a subclass of binary_function .

Class binder1st binds the value to the first argument of the binary function, and binder2nd does the same thing for the second argument of the function. The resulting classes can be used in place of a unary predicate in other function calls.

For example, you could use the count_if() algorithm to count all elements in a vector that are less than or equal to 7, using the following:

    vector<int> v;
    int littleNums;
    
    count_if(v.begin, v.end, bind1st(greater<int>(),7),
             littleNums)
    

    This function adds one to littleNums each time the element is greater than 7.

    Interface

      namespace std {
      
        // Class binder1st 
        template <class Operation>
        class binder1st
           : public unary_function<typename 
                                   Operation::second_argument_type,
                                   typename Operation::result_type>
        {
        public:
      
           binder1st(const Operation&,
                     const typename Operation::first_argument_type&);
           
           typename Operation::result_type 
           operator() (const typename
                       Operation::second_argument_type&) const;
        };
      
        // Class binder2nd 
        template <class Operation>
        class binder2nd
           : public unary_function<typename 
                               Operation::first_argument_type, 
                               typename Operation::result_type>
        {
        public:
      
           binder2nd(const Operation&,
                     const typename Operation::second_argument_type&);
           typename Operation::result_type 
           operator()(const typename 
                      Operation::first_argument_type&) const;
        };
      
        // Creator bind1st
        template <class Operation, class T>
        binder1st<Operation> bind1st(const Operation&, const T&);
      
        // Creator bind2nd 
        template<class Operation, class T>
        binder2nd <Operation> bind2nd(const Operation&, const T&);
      }
      

      Example

        //
        // binders.cpp
        //
        
        #include <algorithm>   // for find_if
        #include <functional>  // for equal_to, bind1st, bind2nd
        #include <iostream>    // for cout
        #include <iterator>    // for ostream_iterator
        #include <vector>      // for vector
        
        
        int main ()
        {
            typedef std::vector<int>                  Vector;
            typedef std::equal_to<Vector::value_type> EqualTo;
        
            const Vector::value_type arr [] = { 1, 2, 3, 4, 5 };
        
            // Initialize a vector with the array elements.
            const Vector v1 (arr, arr + sizeof arr / sizeof *arr);
        
            // Value to look for.
            const Vector::value_type x (3);
        
            // Create an 'equal to 3' unary predicate by binding the value
            // 3 to the EqualTo binary predicate.
            const std::binder1st<EqualTo> equal_to_3 =
                std::bind1st (EqualTo (), x);
        
            // Now use this new predicate in a call to find_if.
            const Vector::const_iterator it1 =
                std::find_if (v1.begin (), v1.end (), equal_to_3);
        
            // Even better, construct the new predicate on the fly.
            const Vector::const_iterator it2 =
                std::find_if (v1.begin (), v1.end (), std::bind1st (EqualTo (), x));
        
            // And now the same thing using bind2nd.
            // Same result since EqualTo is commutative.
            const Vector::const_iterator it3 =
                std::find_if (v1.begin (), v1.end (), std::bind2nd (EqualTo (), x));
        
            // Use the same predicate to count the number of elements
            // equal to 3.
            const Vector::size_type n =
                std::count_if (v1.begin (), v1.end (), std::bind2nd (EqualTo (), x));
        
            // Output results.
            std::ostream_iterator<Vector::value_type> out (std::cout, " ");
        
            std::cout << "The vector { ";
            std::copy (v1.begin (), v1.end (), out);
        
            std::cout << "} contains " << n << " element equal to "
                      << x <<  " at offset " <<
                      it1 - v1.begin () << ".\n";
            
            // Exit with status of 0 on success, 1 on failure.
            const bool success = 1 == n && it1 == it2 && it1 == it2 && *it1 == x;
        
            return success ? 0 : 1;
        }
        
        Program Output:
        The vector { 1 2 3 4 5 } contains 1 element equal to 3 at offset 2.
        

        See Also

        Function Objects

        Standards Conformance

        ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 20.3.6

        分享到:
        评论

        相关推荐

          C++常用stl算法.pdf

          例如,`bind1st`和`bind2nd`可以分别固定函数的第一个和第二个参数,而`not1`和`not2`则用于取反函数的结果。 `for_each`是STL中的一个迭代器算法,它接受一个范围(由两个迭代器定义)和一个函数对象,然后对范围...

          C++新标准的内容总结,大纲

          bind:绑定器 bind1st和bind2nd+二元函数对象 =》 一元函数对象 lambda表达式 三:智能指针 shared_ptr和weak_ptr 四:容器 set和map:红黑树 O(lgn) unordered_set和unordered_map :哈希表O(1) array:数组 ...

          C++ function、bind以及lamda表达式

          与C++98中的bind1st和bind2nd相比,C++0x的std::bind更为强大,它可以绑定任意数量和位置的参数。下面是一个使用std::bind的例子: ```cpp #include int Func(int a, int b) { ... } int x = 10; auto ...

          C++进阶STL适配器总结1

          例如,`bind1st`和`bind2nd`可以与STL的仿函数(比如`less&lt;int&gt;`)结合,用于计算数组中满足条件的元素个数。同样,取反器如`not1`和`not2`可以将谓词函数的结果取反,用于反转判断条件。 然后是迭代器适配器,它们...

          STL 源码剖析(侯捷先生译著)

          8.4.2 对参数进行系结(绑定):bind1st, bind2nd 451 8.4.3 用于函数合成:compose1, compose2(未纳入标准) 453 8.4.4 用于函数指针:ptr_fun 454 8.4.5 用于成员函数指针:mem_fun, mem_fun_ref 456 附录A ...

          STL源码解析.PDF

          例如,less对象用于比较元素,bind1st和bind2nd可以绑定函数对象的参数。 在《STL源码解析》这本书中,作者可能深入探讨了以下主题: 1. STL的实现机制:例如,如何通过模板元编程技术实现泛型编程,以及如何利用...

          boost库中mem_fun示例代码, 用于将成员函数转化为函数指针

          此外,`mem_fun`也可以和`std::bind2nd`或`std::bind1st`(在C++11之后被`std::bind`取代)一起使用,如果你需要固定一部分参数。例如,如果你有一个接受两个参数的成员函数`add(int, int)`,你可以先绑定其中一个...

          C++ STL--数据结构与算法实现(余文溪)示例程序代码.rar

          6. 适配器(Adaptors):包括迭代器适配器(如反向迭代器)和函数对象适配器(如`bind1st`和`bind2nd`,在C++11后被`std::bind`取代)。 在余文溪的示例程序代码中,我们可能会看到如何使用这些组件进行实际编程。...

          STL文档与简单的程序

          4. 函数对象(也称谓适配器或仿函数):这是封装了特定操作的类,例如比较函数(less,greater)、转换函数(identity,bind1st,bind2nd)等。它们可以作为算法的参数,使算法更加灵活。 5. 容器辅助类:包括...

          STLport-4.5.zip_C++标准模板_STLport 4.5_STLport-4.6.2_stlport_stlpor

          4. 功能对象(Functors):这些是重载了操作符的对象,例如比较函数对象(如less、greater)和函数对象适配器(如bind1st、bind2nd),用于自定义算法的行为。 5. 分配器(Allocator):分配器负责内存的分配和释放...

          复件 复件 函数对象--20100125.ppt

          1. **绑定器(binder)**:`bind1st`和`bind2nd`用于固定一个或两个参数,将二元函数对象转化为一元函数对象。 2. **取反器(negator)**:`not1`和`not2`用于改变函数对象的逻辑结果,例如将小于变为大于。 使用...

          短小精悍的STL资料

          4. 功能对象(函数对象):也称为仿函数,它们是封装了特定操作的对象,如比较函数对象(less、greater)和转换函数对象(transform、bind1st、bind2nd)。通过这些对象,开发者可以自定义算法的行为。 在学习STL的...

          STLport-4.5.3.zip_STLport 4.5_stlport_stlport windo_stlport_vc6.

          6. 适配器(Adapters):如函数对象适配器,如bind1st、bind2nd、mem_fun等,以及迭代器适配器,如reverse_iterator等。 在VC6.0环境下,为了使用STLport,开发者需要进行以下步骤: 1. 解压“STLport-4.5.3.zip”...

          清华大学计算机课程之《C++程序设计》

          适配器如bind1st、bind2nd和ptr_fun用于将普通函数转换为函数对象,使得算法能更好地与用户定义的函数和成员函数配合使用。 在学习这门课程时,你将深入理解C++的面向对象特性,如类、继承、多态,以及STL如何利用...

          【STL源代码】C++标准库STL源代码下载

          - `functional`:包含各种函数对象,如`bind1st`、`bind2nd`、`ptr_fun`等,用于函数对象的创建和操作。 4. 其他: - `stl_algo.h`:包含了STL的主要算法定义,如排序、查找、变换等。 - `stl_rope.h`:`rope`是...

          Boost.orglambda模块.zip

          它还支持与`std::bind1st`, `std::bind2nd`类似的绑定功能,但更加灵活,可以处理更多的操作符。 在“lambda-develop”中,我们可以期待找到关于Boost.Lambda库的源代码、示例、文档和可能的测试用例。这些资料对于...

          南阳理工oj stl练习ac代码

          例如,less和greater用于比较,plus用于加法,bind1st和bind2nd用于固定一个或两个参数。 5. ACM竞赛: ACM(International Collegiate Programming Contest)是全球知名的大学生程序设计竞赛,其中STL的熟练运用...

          C++学习代码

          例如,less用于小于比较,greater用于大于比较,bind1st和bind2nd可以绑定函数对象的第一个或第二个参数。 在"C++学习代码"这个压缩包中,很可能包含了使用STL编写的示例代码,可能涉及了上述的各个组件和概念。...

          C++ STL实现包含常用stl模板的手动实现.zip

          比如,你可以创建一个比较函数对象来改变排序的标准,或者使用适配器函数对象如`bind1st`和`bind2nd`来固定函数调用的部分参数。 手动实现STL模板的过程可以帮助我们深入理解这些组件的内部机制。例如,实现`vector...

          STL入门课件

          此外,还有一些适配器,如`bind1st`和`bind2nd`,可以将二元函数转换为一元函数,或者固定函数的一部分参数。 在学习STL时,首先要理解这些基本组件的作用和使用方法,然后通过实例来练习如何结合它们解决实际问题...

        Global site tag (gtag.js) - Google Analytics