如何使用Functor/Predicate查找vector中首个比前序元素小的元素
C++ 查找vector中首个比前一个元素更小的元素实现方案
find_if 传入的默认谓词每次仅接收当前遍历的元素作为入参,要实现相邻元素对比,可以利用仿函数的成员变量存储上一个元素的状态来实现。
仿函数实现
你可以定义带状态的仿函数,内部存储前序遍历元素的值:
struct LessThanPrev { // 存储上一个遍历的元素值 int prev_val; // 构造函数传入第一个元素作为初始比较基准 explicit LessThanPrev(int first_val) : prev_val(first_val) {} bool operator()(int current_val) { bool is_less = current_val < prev_val; // 每次比较完成后更新前序值,供下一个元素对比 prev_val = current_val; return is_less; } };
完整调用示例
#include <iostream> #include <vector> #include <algorithm> using namespace std; // 上述仿函数定义放在此处 int main() { vector<int> v = {25, 30, 10, 40}; // 元素不足2个时无比较意义 if (v.size() < 2) { cout << "元素数量不足,无法对比" << endl; return 0; } // 从第二个元素开始遍历,仿函数初始传入第一个元素的值 auto target = find_if(v.begin() + 1, v.end(), LessThanPrev(v[0])); if (target != v.end()) { // 迭代器需要解引用才能拿到指向的元素值 cout << *target << endl; // 输出结果为10,符合预期 } else { cout << "不存在比前一个元素更小的元素" << endl; } return 0; }
简化写法(C++11及以上版本)
如果不需要复用对比逻辑,可以用捕获外部变量的lambda实现,逻辑和仿函数完全一致,代码更简洁:
int prev_val = v[0]; auto target = find_if(v.begin() + 1, v.end(), [&prev_val](int curr) { bool res = curr < prev_val; prev_val = curr; return res; });
内容的提问来源于stack exchange,提问作者Visor450
相关产品推荐
相关产品推荐

