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
分享到:
相关推荐
例如,`bind1st`和`bind2nd`可以分别固定函数的第一个和第二个参数,而`not1`和`not2`则用于取反函数的结果。 `for_each`是STL中的一个迭代器算法,它接受一个范围(由两个迭代器定义)和一个函数对象,然后对范围...
bind:绑定器 bind1st和bind2nd+二元函数对象 =》 一元函数对象 lambda表达式 三:智能指针 shared_ptr和weak_ptr 四:容器 set和map:红黑树 O(lgn) unordered_set和unordered_map :哈希表O(1) array:数组 ...
与C++98中的bind1st和bind2nd相比,C++0x的std::bind更为强大,它可以绑定任意数量和位置的参数。下面是一个使用std::bind的例子: ```cpp #include int Func(int a, int b) { ... } int x = 10; auto ...
例如,`bind1st`和`bind2nd`可以与STL的仿函数(比如`less<int>`)结合,用于计算数组中满足条件的元素个数。同样,取反器如`not1`和`not2`可以将谓词函数的结果取反,用于反转判断条件。 然后是迭代器适配器,它们...
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 ...
例如,less对象用于比较元素,bind1st和bind2nd可以绑定函数对象的参数。 在《STL源码解析》这本书中,作者可能深入探讨了以下主题: 1. STL的实现机制:例如,如何通过模板元编程技术实现泛型编程,以及如何利用...
此外,`mem_fun`也可以和`std::bind2nd`或`std::bind1st`(在C++11之后被`std::bind`取代)一起使用,如果你需要固定一部分参数。例如,如果你有一个接受两个参数的成员函数`add(int, int)`,你可以先绑定其中一个...
6. 适配器(Adaptors):包括迭代器适配器(如反向迭代器)和函数对象适配器(如`bind1st`和`bind2nd`,在C++11后被`std::bind`取代)。 在余文溪的示例程序代码中,我们可能会看到如何使用这些组件进行实际编程。...
4. 函数对象(也称谓适配器或仿函数):这是封装了特定操作的类,例如比较函数(less,greater)、转换函数(identity,bind1st,bind2nd)等。它们可以作为算法的参数,使算法更加灵活。 5. 容器辅助类:包括...
4. 功能对象(Functors):这些是重载了操作符的对象,例如比较函数对象(如less、greater)和函数对象适配器(如bind1st、bind2nd),用于自定义算法的行为。 5. 分配器(Allocator):分配器负责内存的分配和释放...
1. **绑定器(binder)**:`bind1st`和`bind2nd`用于固定一个或两个参数,将二元函数对象转化为一元函数对象。 2. **取反器(negator)**:`not1`和`not2`用于改变函数对象的逻辑结果,例如将小于变为大于。 使用...
4. 功能对象(函数对象):也称为仿函数,它们是封装了特定操作的对象,如比较函数对象(less、greater)和转换函数对象(transform、bind1st、bind2nd)。通过这些对象,开发者可以自定义算法的行为。 在学习STL的...
6. 适配器(Adapters):如函数对象适配器,如bind1st、bind2nd、mem_fun等,以及迭代器适配器,如reverse_iterator等。 在VC6.0环境下,为了使用STLport,开发者需要进行以下步骤: 1. 解压“STLport-4.5.3.zip”...
适配器如bind1st、bind2nd和ptr_fun用于将普通函数转换为函数对象,使得算法能更好地与用户定义的函数和成员函数配合使用。 在学习这门课程时,你将深入理解C++的面向对象特性,如类、继承、多态,以及STL如何利用...
- `functional`:包含各种函数对象,如`bind1st`、`bind2nd`、`ptr_fun`等,用于函数对象的创建和操作。 4. 其他: - `stl_algo.h`:包含了STL的主要算法定义,如排序、查找、变换等。 - `stl_rope.h`:`rope`是...
它还支持与`std::bind1st`, `std::bind2nd`类似的绑定功能,但更加灵活,可以处理更多的操作符。 在“lambda-develop”中,我们可以期待找到关于Boost.Lambda库的源代码、示例、文档和可能的测试用例。这些资料对于...
例如,less和greater用于比较,plus用于加法,bind1st和bind2nd用于固定一个或两个参数。 5. ACM竞赛: ACM(International Collegiate Programming Contest)是全球知名的大学生程序设计竞赛,其中STL的熟练运用...
例如,less用于小于比较,greater用于大于比较,bind1st和bind2nd可以绑定函数对象的第一个或第二个参数。 在"C++学习代码"这个压缩包中,很可能包含了使用STL编写的示例代码,可能涉及了上述的各个组件和概念。...
比如,你可以创建一个比较函数对象来改变排序的标准,或者使用适配器函数对象如`bind1st`和`bind2nd`来固定函数调用的部分参数。 手动实现STL模板的过程可以帮助我们深入理解这些组件的内部机制。例如,实现`vector...
此外,还有一些适配器,如`bind1st`和`bind2nd`,可以将二元函数转换为一元函数,或者固定函数的一部分参数。 在学习STL时,首先要理解这些基本组件的作用和使用方法,然后通过实例来练习如何结合它们解决实际问题...