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

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

C++算法自定义谓词 函数对象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算法处理复杂逻辑。

暂无评论

发送评论 编辑评论


				
上一篇
下一篇
text=ZqhQzanResources