C++中谓词用于STL算法实现灵活逻辑,主要包括函数对象、Lambda表达式和函数指针。函数对象可保存状态,适用于复杂判断;Lambda语法简洁,支持捕获外部变量,适合局部短小逻辑;函数指针调用高效但无状态。按需选择:简单临时用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是C++11引入的匿名函数,语法简洁,适合短小的谓词逻辑。
立即学习“C++免费学习笔记(深入)”;
示例:筛选长度大于3的字符串使用
std::find_if
#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]
普通函数也可作为谓词传入算法,适用于无状态、复用性强的逻辑。
示例:使用函数指针排序整数绝对值
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。
根据使用场景选择最合适的谓词方式:
现代C++开发中,Lambda因简洁性成为首选,尤其适合算法中的临时条件。
基本上就这些,掌握这三种谓词形式,能更高效地使用STL算法处理复杂逻辑。
以上就是C++算法自定义谓词 函数对象lambda使用的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号