如何用std::all_of简化Lambda过滤器集合的匹配判断逻辑?
当然可以用
std::all_of简化这个过滤器函数! 你的原始filter函数逻辑是:只有当容器中所有过滤器都返回true时,整体才返回true——这恰好和<algorithm>库中的std::all_of算法语义完全匹配,完美适配这个场景。
修改后的简化版代码
直接替换原来的filter函数即可,记得要包含algorithm头文件:
#include <algorithm> template<typename T> bool filter(const T& filters, int val) { return std::all_of(filters.begin(), filters.end(), [val](const auto& filter) { return filter(val); }); }
逻辑匹配说明
std::all_of会遍历filters容器的完整范围,对每个过滤器执行传入的lambda谓词- 只要有一个过滤器返回
false,std::all_of会立即终止遍历并返回false,和你原代码里的提前返回逻辑完全一致 - 只有所有过滤器都返回
true时,std::all_of才会返回true,和原函数的最终返回结果完全对齐
原调用逻辑无需改动
你的main函数里的测试代码完全不用修改,运行结果会和之前保持一致。另外提个小优化:原lambda里的[&]可以改成[],因为没有捕获任何外部变量,更符合代码语义:
int main() { using FilterContainer = std::vector<std::function<bool(int)>>; FilterContainer lxFilters; lxFilters.emplace_back([](int val) { return val % 5 == 0; }); lxFilters.emplace_back([](int val) { return val >= 10; }); lxFilters.emplace_back([](int val) { return val <= 100; }); std::vector<bool> filteredValues; filteredValues.push_back(filter(lxFilters, 5)); // False filteredValues.push_back(filter(lxFilters, 10)); // True filteredValues.push_back(filter(lxFilters, 50)); // True filteredValues.push_back(filter(lxFilters, 100)); // True filteredValues.push_back(filter(lxFilters, 42)); // False // ... 其他测试逻辑 }
顺便补充:如果后续需求变化,比如需要只要有一个过滤器匹配就返回true,可以用std::any_of;如果需要所有过滤器都不匹配才返回true,则用std::none_of——这三个算法就是为这类遍历判断场景设计的,能帮你省去手写循环的冗余代码。
内容的提问来源于stack exchange,提问作者Aaron Stackpole
相关产品推荐
相关产品推荐

