首页 > 后端开发 > C++ > 正文

C++算法自定义谓词 函数对象lambda使用

P粉602998670
发布: 2025-08-31 08:22:01
原创
910人浏览过
C++中谓词用于STL算法实现灵活逻辑,主要包括函数对象、Lambda表达式和函数指针。函数对象可保存状态,适用于复杂判断;Lambda语法简洁,支持捕获外部变量,适合局部短小逻辑;函数指针调用高效但无状态。按需选择:简单临时用Lambda,需状态用函数对象,独立逻辑用函数指针。

c++算法自定义谓词 函数对象lambda使用

在C++中,算法常配合谓词使用,以实现灵活的数据处理逻辑。谓词可以是函数指针、函数对象或Lambda表达式。它们广泛用于标准库算法如

sort
登录后复制
find_if
登录后复制
remove_if
登录后复制
等,用来定义比较、筛选或判断条件。

函数对象作为谓词

函数对象(仿函数)是重载了 operator() 的类实例,可像函数一样调用。它比普通函数更灵活,能保存状态。

示例:按字符串长度排序

定义一个函数对象,用于比较两个字符串的长度:

#include <algorithm>
#include <vector>
#include <string>
#include <iostream>

struct LongerString {
    bool operator()(const std::string& a, const std::string& b) const {
        return a.length() < b.length();
    }
};

int main() {
    std::vector<std::string> words = {"hi", "hello", "cpp", "lambda"};
    std::sort(words.begin(), words.end(), LongerString());

    for (const auto& w : words)
        std::cout << w << " ";
    // 输出: hi cpp hi hello lambda
    return 0;
}
登录后复制

函数对象的优势在于可携带成员变量,实现有状态的判断逻辑。

Lambda表达式作为谓词

Lambda是C++11引入的匿名函数,语法简洁,适合短小的谓词逻辑。

立即学习C++免费学习笔记(深入)”;

示例:筛选长度大于3的字符串

使用

std::find_if
登录后复制
配合Lambda查找第一个长度超过3的字符串:

#include <algorithm>
#include <vector>
#include <string>
#include <iostream>

int main() {
    std::vector<std::string> words = {"a", "bb", "ccc", "hello"};

    auto it = std::find_if(words.begin(), words.end(),
        [](const std::string& s) { return s.length() > 3; }
    );

    if (it != words.end())
        std::cout << "Found: " << *it;  // 输出: Found: hello
    return 0;
}
登录后复制

Lambda捕获列表可访问外部变量,增强灵活性。例如

[&threshold]
登录后复制
捕获局部变量用于条件判断。

即构数智人
即构数智人

即构数智人是由即构科技推出的AI虚拟数字人视频创作平台,支持数字人形象定制、短视频创作、数字人直播等。

即构数智人 36
查看详情 即构数智人

函数指针作为谓词

普通函数也可作为谓词传入算法,适用于无状态、复用性强的逻辑。

示例:使用函数指针排序整数绝对值

bool abs_less(int a, int b) {
    return std::abs(a) < std::abs(b);
}

int main() {
    std::vector<int> nums = {-5, 3, -2, 8, -1};
    std::sort(nums.begin(), nums.end(), abs_less);

    for (int n : nums)
        std::cout << n << " ";  
    // 输出: -1 -2 3 -5 8
    return 0;
}
登录后复制

函数指针调用开销小,但无法保存状态,灵活性低于函数对象和Lambda。

选择合适的谓词形式

根据使用场景选择最合适的谓词方式:

  • 逻辑简单且局部使用 → 用 Lambda,代码紧凑
  • 需要保存状态或多次复用 → 用 函数对象
  • 逻辑独立、无捕获需求 → 用 函数指针

现代C++开发中,Lambda因简洁性成为首选,尤其适合算法中的临时条件。

基本上就这些,掌握这三种谓词形式,能更高效地使用STL算法处理复杂逻辑。

以上就是C++算法自定义谓词 函数对象lambda使用的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号