jquery中bind和on的区别
bind()函数是jQuery 1.7之前或更早版本采用的一个用来绑定事件处理程序的函数;on()函数是jQuery 1.7版本提供的首选的用来绑定事件处理程序的函数;从1.7版本的介绍以及参数描述来看,其实这两个函数基本上用法一致,但可能在早期的版本中,bind()函数一次只能为标签对象绑定一个事件的处理程序,而on()函数则可以一次为多个不同的事件绑定处理程序。
jQuery中的bind()函数跟on()函数有什么区别呢?
.bind()与.on()的区别:(1)是否支持selector这个参数值。由于javascript的事件冒泡特性,如果在父元素上注册了一个事件处理函数,当子元素上发生这个事件的时候,父元素上的事件处理函数也会被触发。如果使用on的时候,不设置selector,那么on与bind就没有区别了。(2)on绑定的事件处理函数,对于未来新增的元素一样可以的,和delegate效果相同,而bind则不行。 (3) delegate用法与on()相同,只是参数的顺序不同:扩展资料:.bind()与.on()的实际应用:1.bind()是直接绑定在元素上 ,将一本地地址与一套接口捆绑。如无错误发生,则bind()返回0。否则的话,将返回-1,应用程序可通过WSAGetLastError()获取相应错误代码。用于事件处理程序function ClassName(){this.eventHandler = (function(){}).bind(this);}2.on()则实现事件代理, 可以在匹配元素上绑定一个或者多个事件处理函数。(1) 用来绑定多事件,并且为同一函数,如:$('div').on('click mouseover',function(){//do sth});(2)多个事件绑定不同函数,如:$('div').on({'click':function(){//do sth},'mouseover':function(){//do sth}});(3)事件代理,如:html:按钮1jq:$('#bt1').on('click',function(){$('body').append('按钮2');});$('body').on('click','.bt2',function(){console.log('这是bt2');}参考资料:百度百科-bind()
C++ bind函数
bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指
定的参数,可以使用占位符_1、_2、_3来表示。-1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。
bind可以绑定到普通函数、函数对象、类的成员函数和类的成员变量。先介绍最简单的这种试试理解。
普通函数
1 void nine_arguments(int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9);
int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9;
2bind(nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7 (i1,i2,i3,i4,i5,i6,i7,i8,i9);
3bind(nine_arguments,i9,i2,i1,i6,i3,i8,_1,_2,_1) (i8,i9);
4bind(nine_arguments, i9,i2,i1,i6,i3,i8,i4,i5,i7) ();
上述5个例子中:
1是普通函数形势
2是指,对1这个函数,我们更换其中参数的顺序,你看nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7,后面跟的第一个指定的占位符是9,所以意思是,对后面括号里的第一个参数i1,把他的值赋给原函数
void nine_arguments(int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9)
里的第9个参数,后面的依次对应。最终等价于调用函数nine_arguments(i3,i2,i5,i7,i8,i4,i9,i6,i1)
理解2的基础上,3等价于nine_arguments(i3,i2,i5,i7,i8,i4,i8,i9,i8)
应该是这样。。
c++11里面的bind函数是什么鬼,看不懂,请高手指教
std::bind简单调用(1)template /* 未指定 */ bind (Fn&& fn, Args&&... args);跟上返回值(2)template /* 未指定 */ bind (Fn&& fn, Args&&... args);绑定(Bind)函数与参数的作用,返回一个基于fn的函数对象,但是已经提前绑定了调用需要的参数。调用这个函数对象相当于调用用绑定的参数调用fn。下面给你一个使用例子吧:// bind 用例#include #include // 自定义的一个函数double my_divide (double x, double y) {return x/y;}// 自定义的一个结构体struct MyPair { double a,b; double multiply() {return a*b;}};int main () { // 这个using是为了使用 _1, _2, _3,... using namespace std::placeholders; // 捆绑函数: auto fn_five = std::bind (my_divide,10,2); // 返回 10/2 std::cout (my_divide,_1,_2); // 返回 int(x/y) std::cout << fn_rounding(10,3) << '\n'; // 输出 3 MyPair ten_two {10,2}; // 捆绑成员函数: auto bound_member_fn = std::bind (&MyPair::multiply,_1); // 返回 x.multiply() std::cout << bound_member_fn(ten_two) << '\n'; // 输出 20 auto bound_member_data = std::bind (&MyPair::a,ten_two); // 返回 ten_two.a std::cout << bound_member_data() << '\n'; // 输出 10 return 0;}运行结果:550.232010
一个c++ 程序看不懂 请高手指教!!!
#include
using namespace std;
int C(int r,int n)
{
int answer=1;
int a=1,b=1;
if(r!=0)
{
for(int i=n;i>n-r;i--)
{
a=a*i;
}
for(int j=2;j<=r;j++)
b=b*j;
answer=a/b;
}
return answer;
}//这个函数以及组合的详细见下面的解释A。
int main ()
{
int i,j;
char ch[10];
int ch1[10];
cin>>ch;//输出当前字符串Ch
int n=strlen(ch);//判断字符串长度
int sum=1;
int start=1;
for(i=1;i<n;i++)//计算 当前位数为N的字符串Ch的 前(n-1),(n-2)```1,个字符串组合的总数
sum+=C(i,26);
for(i=0;i<n;i++)//将输入!字符串!的每一位转化为数字以确定字符串中每一位 !字符! 在a,b,c...z中的第几位以及该!字符!之前有几个!字符!(注意字符和字符串)
ch1[i]=ch[i]-96;
for(i=n;i>=1;i--)//确定Ch的位数后,对每一位进行排列组合的分析,假设 Ch = “bdfr”,则先判断第一位b之前的四位字符串总和 ,下面解释都是以第一次循环做解释
{
for(j=start;j<ch1[n-i];j++)//计算第一位“b”之前的四位字符串总和,ch1[n-i](i此时为n)此时表示第四位字符“b”在字母表中的排位,第2,即j<2 ;
{
sum+=C(i-1,26-j);//排列组合 见解释B
}
start=ch1[n-i]+1;//计算第一位“b”之前的四位字符串总和之后,开始计算第二位“d”之前的四位字符串总和,此时第一位已经固定 ,第二位应该从(第一位+1)的字符开始考虑····所以start=ch1[n-i]+1
}
cout<<sum<<endl;
system("pause");
return 0;
}
解释A。题目的意思,假设我输出的是四位字符串,那么就是相当于从26个字母中选择4个插入四个并列空格子1 -2 -3 -4 ,因为这字符顺序是固定的,所以我只需求出26个字母中每4个不同的字母一共有多少种组合方式即为这个四位字符串总共有多少个,以此类推,当我输出的是N位字符串,那么我从M个任意取出N个不同的组合,公式C = M! / [ (M -N )! * N! ]
解释B。计算第一位“b”之前的四位字符串总和,第一位为b,那么b之前只有a,即求所有a为第一位的四位字符串,因为首位a固定,后面即是从25个字母中取出3个进行组合,C = 25!(22!*3!);
解释的很详细了 不懂追问,组合不明白的话建议看下概念,还有,之前的程序没问题,楼上说的aa 。ba,cb什么的都是不符合题意要求的字符串。程序中的C()函数已经排除了这些不合要求的字符串,所以只要输入的字符串符合要求,得出的结果一定是正确的
C++ bind函数
bind是一组用于函数绑定的模板。在对某个函数进行绑定时,可以指定部分参数或全部参数,也可以不指定任何参数,还可以调整各个参数间的顺序。对于未指定的参数,可以使用占位符_1、_2、_3来表示。-1表示绑定后的函数的第1个参数,_2表示绑定后的函数的第2个参数,其他依次类推。
bind可以绑定到普通函数、函数对象、类的成员函数和类的成员变量。下面分别进行介绍。
1、普通函数
1 void nine_arguments(int i1,int i2,int i3,int i4,int i5,int i6,int i7,int i8,int i9);
2 int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9;
3 bind(nine_arguments,_9,_2,_1,_6,_3,_8,_4,_5,_7(i1,i2,i3,i4,i5,i6,i7,i8,i9);
4 bind(nine_arguments,i9,i2,i1,i6,i3,i8,_1,_2,_1)(i8,i9);
5 bind(nine_arguments, i9,i2,i1,i6,i3,i8,i4,i5,i7)();
2、函数对象
1 class CStudent
2 {
3 public:
4 void operator() (string strName, int nAge)
5 {
6 cout << strName << " : " << nAge << endl;
7 }
8 };
9 bind(CStudent(), "Mike", _1)(12);
3、类的成员函数
1 struct TAdd
2 {
3 int Add(int x,int y)
4 {
5 return x+y;
6 }
7 };
8 TAdd tAdd;
9 TAdd *p = new TAdd();
10 shared_ptr *q(p);
11 bind(TAdd::Add, tAdd, 2, 3)();
12 bind(TAdd::Add, p, 2, 3)();
13 bind(TAdd::Add, q, 2, 3)();
4、类的成员变量
1 void Output(const string &name)
2 {
3 cout << name << endl;
4 }
5
6 map map1;
7 for_each(map1.begin(), map1.end(), bind(Output, bind(map<int,
8 string>::value_type::second, _1)));
bind还可以进行嵌套绑定。假设有一个CPerson类,该类有一个获取年龄的接口int GetAge(),现在有一个CPerson对象的vector,需要对其进行排序,则可以如下使用bind:
1 vector vctPerson;
2 sort(vctPerson.begin(), vctPerson.end(), bind(less(),
3 bind(CPerson::GetAge, _1), bind(CPerson::GetAge, _2)));
假设有一个整数的vector, 现在想要获取其中大于20但小于30的整数的个数,则有:
1 count_if(vctNum.begin(), vctNum.end, bind(logic_and(),
2 bind(greater(), _1, 20), bind(less(), _1, 30)));
在使用bind时,还有一些需要特别注意的地方,下面逐一进行介绍。
1、对于指定了值的参数,bind返回的函数对象会保存这些值,并且缺省是以传值方式保存的。考虑下面的代码:
1 void inc(int &a) { a++; }
2 int n = 0;
3 bind(inc, n)();
调用bind返回的函数对象后,n仍然等于0。这是由于bind时,传入的是n的拷贝。如果需要传入n的引用,则可以使用ref或cref函数,比如:
1 bind(inc, ref(n))(); // n现在等于1了
2、bind的第一个参数是一个函数对象,不能用占位符来代替。考虑下面的代码:
1 typedef function Func;
2 vector vctFunc;
3 for_each(vctFunc.begin(), vctFunc.end(), bind(_1, 5)); // 编译出错
此时,可以借助apply模板。apply模板的第一个参数是传入的函数对象,后面可以有若干个参数,表示函数对象的参数。比如:
1 apply a; // void是函数对象的返回值类型
2 a(f); // 相当于调用f()
3 a(f, x); // 相当于调用f(x)
4 a(f, x, y); // 相当于调用f(x, y)
使用apply后,我们可以将vctFunc中的元素当作占位符传递过来。参考代码如下:
1 for_each(vctFunc.begin(), vctFunc.end(), bind(apply(), _1, 5));
-- 本文来源于创世软件团队博客, 原文地址: http://www.cnblogs.com/hujian/archive/2012/12/08/2809298.html
为什么一个类的成员函数不能用bind调用另一个
1 #include
2 using namespace std;
3 class a{
4 public:
5 a(int i):value(i){
6 }
7 int f1();
8 int f2();
9 private:
10 int value;
11 };
12 int a::f1(){
13 cout << "f1" << endl;
14 }
15 int a::f2(){
16 this->f1(); 这里调用
17 cout << "the value is " << value << endl;
18 }
19 int main(){
20 a a1(100);
21 a1.f1();
22 a1.f2();
23 return 0;
24 }