You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 21:06:03