C++传入匿名lambda调用vector筛选函数无输出问题排查
问题根因
程序无输出的核心原因是传入的lambda筛选逻辑完全写反了:你当前的代码筛选的是同时能被2、3、5整除的数,而题目要求筛选不能被2、3、5任意一个整除的数,测试用例中不存在满足你当前筛选条件的数,因此结果数组为空,自然没有打印内容。
那个有符号/无符号不匹配的警告是循环变量类型问题,不会影响本次运行结果,把循环变量i声明为size_t类型即可消除。
逻辑错误说明
你写的lambda返回语句return !(x % 2 || x % 3 || x % 5);实际行为如下:
- 对整数取余运算,余数为0代表可被整除,对应布尔值
false;余数非0代表不可被整除,对应布尔值true - 只有当
x%2、x%3、x%5全为0(即x同时是2、3、5的公倍数,最小为30)时,括号内的或运算结果才为false,取反后得到true,该数才会被加入结果集 - 你提供的测试数组中没有30的倍数,因此结果数组长度为0,循环打印不会执行任何输出。
修复代码
将lambda判断条件改为「对2、3、5取余均不为0」即可,两种等价写法任选其一:
// 写法1:直接判断所有余数非0 vector<int> rez = izdvoji(brojevi, [](int x) -> bool { return x % 2 != 0 && x % 3 != 0 && x % 5 != 0; }); // 写法2:通过德摩根定律改写,逻辑和写法1完全一致 vector<int> rez = izdvoji(brojevi, [](int x) -> bool { return !(x % 2 == 0 || x % 3 == 0 || x % 5 == 0); });
替换后运行即可得到预期输出:1 7 23 1 1 433 7 433
内容的提问来源于stack exchange,提问作者Sadlyfe
相关产品推荐
相关产品推荐

