1. 定义
标准库定义的函数对象(Library-Defined Function Objects):标准库在头文件functional中定义了一组表示算术运算符、关系运算符和逻辑运算符的类,每个类分别定义了一个执行命名操作的调用运算符。
这些类都被定义为模板的形式,可以为其指定具体的应用类型(即调用运算符的形参类型)。
eg.
vector<string> svec = {"a31", "b1" };sort(svec.begin(), svec.end(), greater<string>());for_each(svec.begin(), svec.end(), [](const string& s){std::cout << s << endl; });plus<int> intAdd;//可执行int加法的函数对negate<int> intNegate;//可对int值取反的函数对象int sum = intAdd(10, 20);//sum=30std::cout << sum << endl;sum = intAdd(10, intNegate(10));//sum=0std::cout << sum << endl;
输出结果为
b1a31300
2. 标准库函数对象列表:
3. 可以比较指针
eg.
//lambda表达式是比较两个字符串大小string a1 = "b1";string b1 = "a1";vector<string*> nameTable = {&a1 , &b1}; // vector of pointerssort(nameTable.begin(), nameTable.end(),[](string* a, string* b) {return *a < *b; });for_each(nameTable.begin(), nameTable.end(), [](string* s){std::cout << *s << endl; });//标准库比较两个指针的内存地址, vector<string*> nameTable2 = {&a1 , &b1 }; // vector of pointers sort(nameTable2.begin(), nameTable2.end(), less<string*>());for_each(nameTable2.begin(), nameTable2.end(), [](string* s){std::cout << *s << endl; });
输出:
a1b1b1a1
【引用】
[1] 代码functionObject.h