如何使用std::any_of?对其参数形式及多值匹配用法的疑问
搞懂std::any_of的用法:从困惑到上手
哈哈,我懂你的困惑!一开始看到std::any_of的时候,确实容易误以为它能直接像any_of(1,2,3)这样传一堆值,但其实它的设计思路是针对遍历一个元素范围的,咱们一步步拆解清楚。
先拆解函数原型
先看你看到的那个函数原型:
bool any_of(InputIt first, InputIt last, UnaryPredicate)
每个参数的作用是:
InputIt first和InputIt last:这是一对迭代器,用来圈定你要检查的元素范围——比如一个vector的begin()到end(),或者一个普通数组的首尾指针,本质就是告诉函数“我要检查从first到last(不包含last)的这堆元素”。UnaryPredicate:这是一个“一元谓词”,简单说就是一个能接收单个参数、返回bool值的东西——可以是普通函数、lambda表达式,甚至是重载了operator()的对象。它的作用是定义“什么样的元素算是符合你要的条件”。
用std::any_of实现你的需求
你想要的是检查x是否等于1、2、3中的一个,那得先把这几个目标值放到一个可遍历的范围里(比如数组、std::array、std::vector),然后用std::any_of遍历这个范围,判断有没有元素和x相等。
基础用法:用std::array
#include <algorithm> #include <array> int main() { int x = 2; // 把要比较的目标值放到array容器里 std::array<int, 3> targets = {1, 2, 3}; // any_of遍历targets的所有元素,lambda用来判断当前元素是否等于x if (std::any_of(targets.begin(), targets.end(), [x](int val) { return val == x; })) { // 这里写x匹配到1/2/3时要做的事 } }
用普通数组的写法
如果不想用STL容器,普通数组也可以:
#include <algorithm> int main() { int x = 5; int targets[] = {1, 2, 3}; // 用std::begin和std::end自动获取数组的首尾迭代器 if (std::any_of(std::begin(targets), std::end(targets), [x](int val) { return val == x; })) { // 匹配成功的逻辑 } else { // 没匹配到的逻辑 } }
进阶:封装成你最初想要的调用方式
如果你觉得每次都要写容器麻烦,可以自己封装一个小工具函数,这样就能像你一开始想的那样直接传值调用了:
#include <algorithm> #include <initializer_list> template<typename T, typename... Args> bool is_any_of(const T& x, Args... args) { // 把传入的args打包成一个initializer_list,然后用any_of遍历 return std::any_of(std::begin({args...}), std::end({args...}), [&x](const auto& val) { return val == x; }); } // 调用的时候就非常直观了: int main() { int x = 3; if (is_any_of(x, 1, 2, 3)) { // do something } }
C++20的简化写法
如果你的编译器支持C++20,用std::ranges::any_of会更简洁,不需要手动写begin()和end():
#include <ranges> #include <array> int main() { int x = 1; auto targets = std::array{1, 2, 3}; if (std::ranges::any_of(targets, [x](int val) { return val == x; })) { // ... } }
总结一下
std::any_of的核心逻辑是检查一个范围内是否存在至少一个满足条件的元素,所以它必须依赖一个可遍历的元素范围,而不是直接接收离散的多个值。通过把目标值放到容器/数组里,配合谓词判断,就能完美实现你想要的“检查x是否匹配多个值中的一个”的需求了。
内容的提问来源于stack exchange,提问作者baguettio
相关产品推荐
相关产品推荐

