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

在C++中,算法常配合谓词使用,以实现灵活的数据处理逻辑。谓词可以是函数指针、函数对象或Lambda表达式。它们广泛用于标准库算法如
、
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]
捕获局部变量用于条件判断。
函数指针作为谓词
普通函数也可作为谓词传入算法,适用于无状态、复用性强的逻辑。
示例:使用函数指针排序整数绝对值
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算法处理复杂逻辑。