C++ Primer 5th笔记(chap 14 重载运算和类型转换)标准库函数对象

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

【引用】

[1] 代码functionObject.h

猜你喜欢

转载自blog.csdn.net/thefist11cc/article/details/114163441