C++学习,标准库 <functional>

C++ 标准库 <functional> 头文件提供了一组函数模板,这些模板允许使用函数对象(function objects)作为参数传递给算法,或者作为算法的返回值。函数对象是那些重载了 operator() 的对象,它们可以像普通函数一样被调用。

C++ 中,函数对象是一种特殊的类,它重载了 operator() 来允许对象像函数一样被调用。这使得我们可以将行为作为对象传递,增加了代码的灵活性和可重用性。

 

常用的函数对象

  1. 算术操作
    • std::plus:二元谓词对象类,执行加法操作(x + y)。
    • std::minus:二元谓词对象类,执行减法操作(x - y)。
    • std::multiplies:二元谓词对象类,执行乘法操作(x * y)。
    • std::divides:二元谓词对象类,执行除法操作(x / y)。
    • std::modulus:二元谓词对象类,执行取模操作(x % y)。
    • std::negate:一元谓词对象类,执行取负操作(-x)。
  2. 比较操作

    • std::equal_to:二元谓词对象类,判断两个值是否相等(x == y)。
    • std::not_equal_to:二元谓词对象类,判断两个值是否不相等(x != y)。
    • std::greater:二元谓词对象类,判断一个值是否大于另一个值(x > y)。
    • std::less:二元谓词对象类,判断一个值是否小于另一个值(x < y)。
    • std::greater_equal:二元谓词对象类,判断一个值是否大于等于另一个值(x >= y)。
    • std::less_equal:二元谓词对象类,判断一个值是否小于等于另一个值(x <= y)。
  3. 逻辑操作

    • std::logical_and:二元谓词对象类,执行逻辑与操作(x && y)。
    • std::logical_or:二元谓词对象类,执行逻辑或操作(x || y)。
    • std::logical_not:一元谓词对象类,执行逻辑非操作(!x)。
    • std::and_:二元谓词对象类,与std::logical_and功能相同(x & y,但注意这里是位运算的与,不过在此上下文中通常用作逻辑与的别名)。
    • std::or_:二元谓词对象类,与std::logical_or功能相同(x | y,但注意这里是位运算的或,不过在此上下文中通常用作逻辑或的别名)。
    • std::xor_:二元谓词对象类,执行逻辑异或操作(x ^ y,但注意这里是位运算的异或,不过在某些上下文中可能用作逻辑异或的别名,尽管C++标准库中未直接定义逻辑异或的函数对象)。
  4. 逻辑否定操作

    • std::unary_negate:一元谓词对象类,其调用时把另一个一元谓词的返回值取反。
    • std::binary_negate:二元谓词对象类,其调用时把另一个二元谓词的返回值取反。
    • std::not1:返回一个对谓词(一元函数)的结果取反的函数对象。
    • std::not2:返回一个对二元谓词(二元函数)的结果取反的函数对象。

 

示例代码:

#include <iostream>  
#include <functional>  
#include <vector>  
#include <algorithm>  
  
// 自定义比较函数对象  
bool compare(int a, int b) {  
    return a < b;  
}  
  
int main() {  
    // 使用std::function存储和调用函数  
    std::function<void()> func = []() {  
        std::cout << "Hello, Lambda!" << std::endl;  
    };  
    func(); // 输出: Hello, Lambda!  
  
    // 使用std::bind绑定函数参数  
    auto bound_add = std::bind([](int a, int b) { return a + b; }, 5, std::placeholders::_1);  
    std::cout << bound_add(10) << std::endl; // 输出: 15  
  
    // 使用自定义比较函数对象排序  
    std::vector<int> v = {5, 3, 9, 1, 4};  
    std::sort(v.begin(), v.end(), compare);  
    for (int i : v) {  
        std::cout << i << " "; // 输出: 1 3 4 5 9  
    }  
    std::cout << std::endl;  
  
    // 使用标准库比较函数对象排序  
    std::sort(v.begin(), v.end(), std::less<int>());  
    for (int i : v) {  
        std::cout << i << " "; // 输出: 1 3 4 5 9  
    }  
    std::cout << std::endl;  
  
    return 0;  
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值