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

使用带自定义lambda比较器的set触发deleted function错误求助

解决std::set使用lambda作为比较器时的“Attempting to reference a deleted function”错误

你遇到的错误核心原因是:std::set的默认构造函数会尝试默认构造其比较器对象,但lambda表达式的默认构造函数是被删除的。当你声明set<int, decltype(cmp)>s;时,编译器尝试创建比较器的默认实例,但lambda不支持默认构造,因此触发该错误。

修复方案

方案1:将lambda实例传递给std::set的构造函数

无捕获的lambda是可拷贝的,只需在创建set时传入lambda对象即可:

auto cmp = [](int a, int b) {
    int sumA = sumCif(a);
    int sumB = sumCif(b);
    if (sumA != sumB) {
        return sumA < sumB;
    } else {
        return a > b;
    }
};

// 传入lambda实例给set构造函数
set<int, decltype(cmp)> s(cmp);

方案2:使用普通函数代替lambda

把比较逻辑写成全局函数,用函数指针作为比较器类型:

bool cmp(int a, int b) {
    int sumA = sumCif(a);
    int sumB = sumCif(b);
    if (sumA != sumB) {
        return sumA < sumB;
    } else {
        return a > b;
    }
}

int main() {
    // 用函数指针作为比较器类型
    set<int, bool(*)(int, int)> s(cmp);
    // ... 后续代码不变
}

方案3:用std::function包装lambda

如果需要更灵活的类型适配,可以用std::function封装lambda:

#include <functional> // 需包含此头文件

// ...

auto cmp = [](int a, int b) {
    int sumA = sumCif(a);
    int sumB = sumCif(b);
    if (sumA != sumB) {
        return sumA < sumB;
    } else {
        return a > b;
    }
};

set<int, function<bool(int, int)>> s(cmp);

额外优化建议

你的比较逻辑已满足std::set要求的严格弱序规则,但可以将各位和的计算改为迭代实现(避免递归栈溢出风险),并提前缓存结果减少重复计算:

auto cmp = [](int a, int b) {
    auto calc_sum = [](int x) {
        int sum = 0;
        while (x > 0) {
            sum += x % 10;
            x /= 10;
        }
        return sum;
    };
    int sumA = calc_sum(a);
    int sumB = calc_sum(b);
    return sumA != sumB ? sumA < sumB : a > b;
};

内容的提问来源于stack exchange,提问作者fantatraieste

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 22:05:13