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=30
std::cout << sum << endl;
sum = intAdd(10, intNegate(10)); //sum=0
std::cout << sum << endl;
输出结果为
b1
a31
30
0
2. 标准库函数对象列表:
算术 | 关系 | 逻辑 |
---|---|---|
plus | equal_to | logical_and |
minus | not_equal_to | logical_or |
multiplies | greater | logical_not |
divides | greater_equal | |
modulus | less | |
negate | less_equal |
3. 可以比较指针
eg.
//lambda表达式是比较两个字符串大小
string a1 = "b1";
string b1 = "a1";
vector<string*> nameTable = {
&a1 , &b1}; // vector of pointers
sort(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; });
输出:
a1
b1
b1
a1
【引用】