使用带自定义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
相关产品推荐
相关产品推荐

