bind1st 和 bind2nd 解析

头文件:

      看这篇文章前,请先看   ptr_fun的使用  和    STL 中 mem_fun 和 mem_fun_ref 的用法

       bind1st和bind2nd函数把一个二元函数对象绑定成为一个一元函数对象。  但是由于二元函数对象接受两个参数,在绑定成为一元函数对象时需要将原来两个参数中的一个绑定下来。   也即通过绑定二元函数对象的一个参数使之成为一元函数对象的。  bind1st是绑定第一个参数,bind2nd则是绑定第二个参数。


下面代码来自 http://blog.csdn.net/huang_xw/article/details/8223617

void test_func_bind()
{
	std::vector v1;
	std::vector::iterator Iter;

	int i;
	for (i = 0; i <= 5; i++)
	{
		v1.push_back(5 * i);
	}

	std::cout << "The vector v1 = ( ";
	std::copy(v1.cbegin(), v1.cend(), std::ostream_iterator(std::cout, " "));
	std::cout << ")" << std::endl;

	// Count the number of integers > 10 in the vector  
	std::vector::iterator::difference_type result1a;
	result1a = count_if(v1.begin(), v1.end(), bind1st(std::less(), 10));
	std::cout << "The number of elements in v1 greater than 10 is: "
		<< result1a << "." << std::endl;

	// Count the number of integers < 10 in the vector  
	std::vector::iterator::difference_type result2;
	result2 = count_if(v1.begin(), v1.end(), bind2nd(std::less(), 10));
	std::cout << "The number of elements in v1 less than 10 is: "
		<< result2 << "." << std::endl;
}

如果把这个函数应用到一个一元函数呢?

也是可以的,对于bind2nd,因为只有一个参数位置,因此它只能绑定这唯一的参数,对于bind1st是不可以的。为什么bind1st不可以,个人理解,只是个人理解,理解不对的话请改正,大家知道类成员函数都有一个隐藏的this,或许这个this充当了第一参数。

复制了一篇不错的代码,原文链接:http://classfoo.com/ccby/article/2CGheO

#include 
#include 
#include 
#include 
#include 
#include 

namespace ClassFoo 
{
	using namespace std;
	class Person {
	private:
		std::string name;
		static int n;
	public:
		Person() 
		{
			std::stringstream ss;
			std::string snum;
			ss << n++;
			ss >> snum;
			name = "foo" + snum;
		}
		void print() const 
		{
			std::cout << name << std::endl;
		}
		void printWithPrefix(std::string prefix) const 
		{
			std::cout << prefix << name << std::endl;
		}
	};

	int Person::n = 0;

	void foo(const std::vector& coll)
	{
		// 对每个元素对象调用成员函数 print()
		for_each(coll.begin(), coll.end(), mem_fun_ref(&Person::print));

		// 对每个元素对象调用成员函数 printWithPrefix()
		// - "person: " 作为参数传递给成员函数
		for_each(coll.begin(), coll.end(),
			bind2nd(mem_fun_ref(&Person::printWithPrefix), "person: "));
	}

	void ptrfoo(const std::vector& coll)
	{
		// 对每个指针指向的元素对象调用成员函数 print()
		for_each(coll.begin(), coll.end(),
			mem_fun(&Person::print));

		// 对每个指针指向的元素对象调用成员函数 printWithPrefix()
		// - "person: " 作为参数传递给成员函数
		for_each(coll.begin(), coll.end(),
			bind2nd(mem_fun(&Person::printWithPrefix), "person: "));
	}
	void ForEach_2() 
	{
		std::cout << "当向量的元素是对象时:" << std::endl;
		std::vector coll(5);
		ClassFoo::foo(coll);

		std::cout << "当向量的元素是指向对象的指针时:" << std::endl;
		std::vector coll2;
		coll2.push_back(new ClassFoo::Person);
		coll2.push_back(new ClassFoo::Person);
		coll2.push_back(new ClassFoo::Person);
		coll2.push_back(new ClassFoo::Person);
		coll2.push_back(new ClassFoo::Person);
		ptrfoo(coll2);
	}
}
int main()
{
	ClassFoo::ForEach_2();

	return 0;
}

bind1st 和 bind2nd 解析_第1张图片


你可能感兴趣的:(C/C++,STL)