当前位置: 首页 > news >正文

C++11 标准库 `find` 与 `find_if` 详解

一、std::find 函数

功能:在指定范围内查找特定值,返回第一个匹配元素的迭代器;若未找到,返回 end() 迭代器。
原型

template <class InputIt, class T>
InputIt find(InputIt first, InputIt last, const T& value);

测试用例

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};
    
    // 查找值为 30 的元素
    auto it = std::find(vec.begin(), vec.end(), 30);
    
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl; // 输出: Found: 30
    } else {
        std::cout << "Not found" << std::endl;
    }
    
    return 0;
}

二、std::find_if 函数

功能:在指定范围内查找满足谓词条件的元素,返回第一个匹配的迭代器;未找到则返回 end()
原型

template <class InputIt, class UnaryPredicate>
InputIt find_if(InputIt first, InputIt last, UnaryPredicate p);

测试用例

#include <algorithm>
#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 3, 5, 7, 8, 9};
    
    // 查找第一个偶数(使用 Lambda 表达式作为谓词)
    auto it = std::find_if(vec.begin(), vec.end(), [](int n) {
        return n % 2 == 0;
    });
    
    if (it != vec.end()) {
        std::cout << "First even: " << *it << std::endl; // 输出: First even: 8
    } else {
        std::cout << "No even found" << std::endl;
    }
    
    return 0;
}

三、findfind_if 的核心差异

特性std::findstd::find_if
查找条件直接匹配固定值 (value)通过谓词(函数、Lambda 等)定义复杂条件
适用场景精确值查找(如整数、字符串)动态或复合条件(如范围、属性判断)
性能直接比较,无额外开销需调用谓词,可能增加开销(取决于逻辑)
灵活性低(仅限相等性检查)高(支持任意自定义条件)

四、关键差异总结

  1. 条件形式

    • find:查找与 value 严格相等的元素。
    • find_if:通过谓词自定义条件(如大于、复合逻辑等)。
  2. 代码示例对比

    // find: 直接查找值为 5 的元素
    auto it1 = std::find(vec.begin(), vec.end(), 5);
    
    // find_if: 查找大于 5 的元素
    auto it2 = std::find_if(vec.begin(), vec.end(), [](int n) { return n > 5; });
    
  3. 性能考虑

    • 两者均为线性搜索(O(n) 复杂度)。
    • find_if 的谓词若包含复杂逻辑(如动态计算),可能影响性能。

五、进阶用法

自定义对象查找

struct Person {
    std::string name;
    int age;
};

std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}};

// 使用 find_if 查找年龄大于 28 的人
auto it = std::find_if(people.begin(), people.end(), [](const Person& p) {
    return p.age > 28;
});

六、总结

  • 优先 find:当查找条件为简单相等性检查时(如基本类型、字符串)。
  • 选择 find_if:需处理复杂条件(如类成员、动态计算)时,利用 Lambda 或函数对象提高灵活性。

七、完整样例代码与输出

测试代码

#include <algorithm>
#include <vector>
#include <iostream>

void find_test(void)
{
    std::vector<int> vec = {10, 20, 30, 40, 50};
    
    // 查找值为 30 的元素
    auto it = std::find(vec.begin(), vec.end(), 30);
    
    if (it != vec.end()) {
        std::cout << "Found: " << *it << std::endl; // 输出: Found: 30
    } else {
        std::cout << "Not found" << std::endl;
    }
}

void find_if_test(void)
{
    std::vector<int> vec = {1, 3, 5, 7, 8, 9};
    
    // 查找第一个偶数(使用 Lambda 表达式作为谓词)
    auto it = std::find_if(vec.begin(), vec.end(), [](int n) {
        return n % 2 == 0;
    });
    
    if (it != vec.end()) {
        std::cout << "First even: " << *it << std::endl; // 输出: First even: 8
    } else {
        std::cout << "No even found" << std::endl;
    }
}

void find_if_test2(void)
{
    std::vector<int> vec = {1, 3, 5, 7, 8, 9};
    
    // 查找第一个偶数(使用 Lambda 表达式作为谓词)
    auto it = std::find_if(vec.begin(), vec.end(), [](int n) { 
        return n > 5;
    });
    
    if (it != vec.end()) {
        std::cout << "First > 5: " << *it << std::endl; // 输出: First even: 8
    } else {
        std::cout << "No even found" << std::endl;
    }
}

struct Person {
    std::string name;
    int age;
};

void find_if_test3(void)
{
    std::vector<Person> people = {{"Alice", 25}, {"Bob", 30}};
    
    // 查找第一个偶数(使用 Lambda 表达式作为谓词)
    auto it = std::find_if(people.begin(), people.end(),  [](const Person& p) { 
        return p.age > 28;
    });
    
    if (it != people.end()) {
        std::cout << "people age > 28: " << it->name << std::endl; // 输出: First even: 8
    } else {
        std::cout << "No even found" << std::endl;
    }
}
int main() {
    std::cout << "====================="<< std::endl;
    std::cout << "find_test start"<< std::endl;
    find_test();

    std::cout << "====================="<< std::endl;
    std::cout << "find_if_test start"<< std::endl;
    find_if_test();

    std::cout << "====================="<< std::endl;
    std::cout << "find_if_test2 start"<< std::endl;
    find_if_test2();

    std::cout << "====================="<< std::endl;
    std::cout << "find_if_test3 start"<< std::endl;
    find_if_test3();
    return 0;
}

结果输出

=====================
find_test start
Found: 30
=====================
find_if_test start
First even: 8
=====================
find_if_test2 start
First > 5: 7
=====================
find_if_test3 start
people age > 28: Bob

相关文章:

  • 基于Spring Boot的三国之家网站的设计与实现(LW+源码+讲解)
  • 学一个前端 UI 框架,要学些什么内容?
  • 使用ThreadLocal可能导致内存泄漏的原因与其底层实现机制
  • 干货!Kubernetes网络模型与访问管理
  • ctfshow REVERSE re2 萌新赛 内部赛 七夕杯 WP
  • 我的世界1.20.1forge模组进阶开发——生物生成2
  • 还在用Excel规划机房变更吗?
  • VSCode 出现一直Reactivating terminals,怎么破
  • ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
  • “浅浅深究”一下ConcurrentHashMap
  • 12-scala样例类(Case Classes)
  • DeepSeek 助力 Vue3 开发:打造丝滑的表格(Table)之添加导出数据功能示例14,TableView15_14多功能组合的导出表格示例
  • 使用 ByteDance 的 UI-TARS Desktop 探索 AI 驱动的 GUI 自动化新前沿
  • 1007 Maximum Subsequence Sum
  • 如何在IDEA中借助深度思考模型 QwQ 提高编码效率?
  • DeepSeek+RAG局域网部署
  • 微软纳德拉最新一期访谈
  • 如何删除git上最后一次提交,Git日常使用操作说明。
  • python高级4
  • Mysql从入门到精通day3————记一次连接查询的武装渗透
  • 杭州钱塘区3宗涉宅用地均以底价成交,共计成交金额25.73亿元
  • 山东枣庄同一站点两名饿了么骑手先后猝死,当地热线:职能部门正调查
  • 1至4月我国汽车产销量首次双超千万辆
  • 2025年度十大IP!IP SH荣膺文化综合类TOP10
  • 浙江公开征集涉企行政执法问题线索,包括乱收费、乱罚款等
  • 韩国大选连发“五月惊奇”:在野党刚“摆脱”官司,执政党又生“内讧”