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

C++中提供的一些关于查找元素的函数

C++中提供的所有关于查找的函数

std::find(begin(), end(), key)

std::find(begin(), end(), key):这个函数用于在一个范围内查找一个等于给定值的元素,返回一个指向该元素的迭代器,如果没有找到则返回范围的结束迭代器。

  • 1.1 例如,如果我们有一个整数向量std::vector<int> v = {1, 2, 3, 4, 5};,我们用std::find查找3
    std::vector<int> iter = std::find(v.begin(), v.end(), 3);if(iter != v.end())std::cout << *iter << std::endl;

std::count()

std::count():这个函数用于统计一个范围内等于给定值的元素的个数,返回一个整数。

  • 2.1 例如,如果我们有一个字符数组char s[] = "Hello, world!";,计算l字符出现的次数,
    我们可以用std::count(s, s + 13, 'l')来统计数组中'l'的个数,返回3。
    int countNum = std::count(s, s + 13, 'w');std::cout << countNum << std::endl;

std::find_if()

std::find_if():这个函数用于在一个范围内查找一个满足给定谓词的元素,返回一个指向该元素的迭代器,如果没有找到则返回范围的结束迭代器。谓词是一个接受一个元素作为参数并返回一个布尔值的函数或函数对象。

  • 3.1 例如,如果我们有一个字符串向量std::vector<std::string> words = {"apple", "banana", "cherry", "date"};,我们可以定义一个谓词函数bool is_longer_than_five(const std::string& s) { return s.size() > 5; },然后用std::find_if(words.begin(), words.end(), is_longer_than_five)来查找第一个长度大于5的字符串,在这个例子中是"banana"。
    std::vector<std::string> words = {"apple", "banana", "cherry", "date"};std::find_if(words.begin(), words.end(), [](const std::string& s){ return s.size() > 5;});

std::any_if()

std::any_if():这个函数用于判断一个范围内是否存在一个满足给定谓词的元素,返回一个布尔值。谓词是同上。

  • 4.1 例如,如果我们有一个浮点数数组double a[] = {1.2, 3.4, 5.6, 7.8};,我们可以定义一个谓词函数bool is_integer(double x) { return std::floor(x) == x; },然后用std::any_if(a, a + 4, is_integer)来判断数组中是否有整数,在这个例子中是false。
    double a[] = {1.2,3.4,5.6,7.8};std::any_if(a, a+4, [](double x){std::floor(x) == x;});

std::binary_search():这个函数用于在一个已经排序的范围内查找一个等于给定值的元素,返回一个布尔值。如果范围没有排序,则结果是未定义的。

  • 5.1 例如,如果我们有一个整数数组int b[] = {2, 4, 6, 8, 10};,我们可以用std::binary_search(b, b + 5, 6)来判断数组中是否有6,在这个例子中是true。

std::lower_bound()

std::lower_bound():这个函数用于在一个已经排序的范围内查找第一个不小于给定值的元素,返回一个指向该元素的迭代器,如果没有找到则返回范围的结束迭代器。

  • 6.1 例如,如果我们有一个整数向量std::vector<int> v = {1, 2, 4, 6, 8};,我们可以用std::lower_bound(v.begin(), v.end(), 5)来查找第一个不小于5的元素,在这个例子中是6。

std::upper_bound()

std::upper_bound():这个函数用于在一个已经排序的范围内查找第一个大于给定值的元素,返回一个指向该元素的迭代器,如果没有找到则返回范围的结束迭代器。

  • 7.1 例如,如果我们有一个整数向量std::vector<int> v = {1, 2, 4, 6, 8};,我们可以用std::upper_bound(v.begin(), v.end(), 5)来查找第一个大于5的元素,在这个例子中是6。

std::equal_range()

std::equal_range():这个函数用于在一个已经排序的范围内查找等于给定值的一段连续元素,返回一个包含两个迭代器的pair,分别指向该段元素的起始和结束位置,如果没有找到则返回两个相等的迭代器。

  • 8.1 例如,如果我们有一个整数向量std::vector<int> v = {1, 2, 4, 4, 4, 6, 8};,我们可以用std::equal_range(v.begin(), v.end(), 4)来查找等于4的一段元素,在这个例子中返回的pair是{v.begin() + 2, v.begin() + 5}³。

时间复杂度

  • std::find():线性时间复杂度,即O(n)
  • std::count():线性时间复杂度,即O(n)
  • std::find_if():线性时间复杂度,即O(n)
  • std::any_if():线性时间复杂度,即O(n)
  • std::binary_search():对数时间复杂度,即O(log n)
  • std::lower_bound():对数时间复杂度,即O(log n)
  • std::upper_bound():对数时间复杂度,即O(log n)
  • std::equal_range():对数时间复杂度,即O(log n)

执行效率由高到低排序

  • std::binary_search()
  • std::lower_bound()
  • std::upper_bound()
  • std::equal_range()
  • std::find()
  • std::count()
  • std::find_if()
  • std::any_if()
http://www.lryc.cn/news/142052.html

相关文章:

  • Wlan——STA上线流程与802.11MAC帧讲解以及报文转发路径
  • Python|爬虫和测试|selenium框架模拟登录示例(一)
  • QT的概述
  • Hive 导入csv文件,数据中包含逗号的问题
  • 1、Odoo开发起点
  • Ubuntu22.04 交叉编译树莓派CM4 kernel
  • 稀疏矩阵搜索(两种方法解决:1.暴力+哈希 2.二分法)
  • NodeJS系列教程、笔记
  • 4.4TCP半连接队列和全连接队列
  • 一键实现 Oracle 数据整库同步至 Apache Doris
  • Unity3D软件安装包分享(附安装教程)
  • Vue2向Vue3过度Vue3组合式API
  • ⛳ Docker 安装 MySQL
  • 4.6 TCP面向字节流
  • uniapp返回上一页并刷新
  • LRU cache的实现细节优化——伪结点的技巧
  • 【C/C++】父类指针指向子类对象 | 隐藏
  • NSSCTF——Web题目2
  • 从零到富:探索CSGO搬砖项目的无限可能
  • Uniapp中vuex的使用
  • SpringBoot案例-配置文件-参数配置化
  • android系统启动流程之zygote(Native)启动分析
  • Win10上ffmpeg出现Invalid report file level
  • Vue3 中引入液晶数字字体(通常用于大屏设计)
  • 从 Future 到 CompletableFuture:简化 Java 中的异步编程
  • 【ARMv8 SIMD和浮点指令编程】NEON 乘法指令——乘法知多少?
  • Nginx详解 第三部分:Nginx高级配置(附配置实例)
  • postman访问ruoyi后台接口
  • 大数据时代的软件开发实践:利用云计算和AI赋能创新
  • 32、启用 HTTP 响应压缩和编程式配置Web应用