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

从基础到进阶:C++ 中 find 函数的全方位解析

 

在 C++ 里,find函数可用于在容器内查找特定值的首个出现位置。C++ 的标准库提供了多种find相关功能,下面为你介绍主要的几种。

1. std::find(定义于<algorithm>头文件)

这个函数适用于所有遵循迭代器模式的容器,像vectorlistarray等。

cpp

#include <algorithm>
#include <vector>
#include <iostream>int main() {std::vector<int> numbers = {10, 20, 30, 40, 50};// 查找值为30的元素auto it = std::find(numbers.begin(), numbers.end(), 30);if (it != numbers.end()) {std::cout << "找到了元素: " << *it << std::endl;std::cout << "位置索引: " << std::distance(numbers.begin(), it) << std::endl;} else {std::cout << "未找到指定元素" << std::endl;}return 0;
}

关键要点

  • 函数的返回值是一个迭代器,若找到了目标元素,迭代器指向该元素;若没找到,则指向容器的末尾(end())。
  • 时间复杂度为 O (n)。

2. std::find_if(定义于<algorithm>头文件)

当你需要依据自定义条件查找元素时,可以使用这个函数。

cpp

#include <algorithm>
#include <vector>
#include <iostream>bool isEven(int num) {return num % 2 == 0;
}int main() {std::vector<int> numbers = {1, 3, 4, 5, 7};// 查找第一个偶数auto it = std::find_if(numbers.begin(), numbers.end(), isEven);if (it != numbers.end()) {std::cout << "第一个偶数是: " << *it << std::endl;} else {std::cout << "没找到偶数" << std::endl;}return 0;
}

关键要点

  • 第三个参数是一个一元谓词(可以是函数、函数对象或者 lambda 表达式),用于定义查找条件。

3. 关联容器的find成员函数(如std::mapstd::set

关联容器自身就提供了find成员函数,其时间复杂度为 O (log n)。

cpp

#include <map>
#include <iostream>int main() {std::map<std::string, int> ages = {{"Alice", 25},{"Bob", 30},{"Charlie", 35}};// 查找Bob的年龄auto it = ages.find("Bob");if (it != ages.end()) {std::cout << "Bob的年龄是: " << it->second << std::endl;} else {std::cout << "未找到Bob的年龄信息" << std::endl;}return 0;
}

关键要点

  • 关联容器会依据键的有序性来快速查找元素。
  • 返回的迭代器是一个键值对(如std::pair<const Key, T>)。

4. 字符串的find成员函数(std::string

该函数用于在字符串里查找子串或者字符。

cpp

#include <string>
#include <iostream>int main() {std::string text = "Hello, world!";// 查找子串"world"size_t pos = text.find("world");if (pos != std::string::npos) {std::cout << "找到了子串,位置在: " << pos << std::endl;} else {std::cout << "未找到子串" << std::endl;}return 0;
}

关键要点

  • 返回值的类型是size_t,代表子串的起始位置。
    - 如果没有找到,返回std::string::npos

总结

函数适用场景返回类型时间复杂度
std::find通用容器的查找迭代器O(n)
std::find_if按自定义条件查找迭代器O(n)
关联容器的find()mapset等容器中按键查找迭代器O(log n)
字符串的find()在字符串中查找子串或字符size_t(位置)O(n)

关于上述的几个函数你看明白了吗,如果有不明白的地方,欢迎及时咨询,有问必答系列...

http://www.xdnf.cn/news/4351.html

相关文章:

  • MySQL 隐式转换及整数转浮点
  • 解锁健康生活:全新养身指南
  • Leetcode Hot 100 三数之和
  • Relay算子注册(在pytorch.py端调用)
  • 卷积神经网络实战(3)
  • 【基础】Python包管理工具uv使用全教程
  • Java日期格式化方法总结
  • DApp 开发:开启去中心化应用新时代
  • Spring事务和事务传播机制
  • C语言| 递归和循环的优缺点
  • 塔能水泵节能方案:精准驱动工厂能耗优化
  • 展锐Android13禁止用户使用超级省电
  • 新一代Python专业编译器Nuitka简介
  • ROS2:自定义接口文件(无废话)
  • 多模态理论知识
  • 二叉树与堆排序(概念|遍历|实现)
  • python酒店在线预定管理系统-酒店客房管理系统-快捷酒店入住系统
  • 【Linux系统】vim编辑器的使用
  • FoMo 数据集是一个专注于机器人在季节性积雪变化环境中的导航数据集,记录了不同季节(无雪、浅雪、深雪)下的传感器数据和轨迹信息。
  • C语言编程--递归程序--求数组的最大元素值
  • 油气地震资料信号处理中的NMO(正常时差校正)
  • 【网络篇】传输层TCP协议的确认应答,超时重传机制
  • IT咨询——企业数据资产怎样评估
  • 满分PPT | 基于数据运营的新型智慧城市实践与思考智慧城市数据中台解决方案智能建筑与智慧城市建设方案
  • 基于nacos实现动态线程池设计与实践:告别固定配置,拥抱弹性调度
  • LabVIEW与 IMAQ Vision 机器视觉应用
  • C++类与对象基础续
  • 15.命令模式:思考与解读
  • 毫米波雷达原理(最通俗的解释)
  • MATLAB程序演示与编程思路,相对导航,四个小车的形式,使用集中式扩展卡尔曼滤波(fullyCN-EKF)