检查std::vector是否包含指定值的C++模板函数实现是否正确?
你的基础实现逻辑是成立的,能够实现判断指定值是否存在于vector中的功能,和FORTRAN INDEX的查找逻辑匹配,但存在几个可以优化的细节和需要注意的使用限制:
可优化点
参数与代码精简
原实现中vector参数没有加const修饰,你这个函数不会修改容器内容,改为const std::vector<T>& vec既可以避免误改容器,也能支持传入const修饰的vector对象;同时value、lambda捕获的比较对象都可以改为const引用,减少大对象(比如自定义类、长字符串)传值的拷贝开销。另外std::any_of本身返回bool值,不需要额外套if判断,直接返回结果即可。
优化后的通用版本代码如下:#include <algorithm> #include <vector> template <typename T> bool contains(const std::vector<T>& vec, const T& value){ return std::any_of(vec.begin(), vec.end(), [&value](const T& j) { return value == j; }); }浮点数场景适配
你提到的浮点数比较陷阱确实存在:浮点数受计算过程、存储精度的影响,直接用==判断相等会出现逻辑上相等的两个值判定为不等的情况。如果需要支持浮点类型的查找,建议单独做浮点类型的模板特化,引入允许的误差阈值epsilon做近似相等判断,特化版本参考:#include <algorithm> #include <vector> #include <cmath> #include <limits> #include <concepts> // 浮点类型特化版本,默认误差阈值使用对应浮点类型的最小精度 template <std::floating_point T> bool contains(const std::vector<T>& vec, const T& value, const T epsilon = std::numeric_limits<T>::epsilon()){ return std::any_of(vec.begin(), vec.end(), [&value, epsilon](const T& j) { return std::abs(value - j) <= epsilon; }); }通用性拓展
当前实现只支持std::vector类型,如果需要适配所有STL顺序容器(比如std::array、std::list等),可以把容器类型也作为模板参数,不用绑定死vector类型。
额外注意
通用版本要求你的自定义类型必须重载了==运算符,否则编译会报错,属于正常的模板语法约束。
内容的提问来源于stack exchange,提问作者MathArt
相关产品推荐
相关产品推荐

