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

STL——查找算法及实例

一 前言

        STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了一些模板类,用来声明函数对象。
STL中算法大致分为四类:
1)、非可变序列算法:指不直接修改其所操作的容器内容的算法。
2)、可变序列算法:指可以修改它们所操作的容器内容的算法。
3)、排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
4)、数值算法:对容器内容进行数值计算。

 二 查找算法(13个)

判断容器中是否包含某个值

    adjacent_find

  在iterator对标识元素范围内,查找一对相邻重复元素,找到则返回指向这对元素的第一个元素的ForwardIterator。否则返回last。重载版本使用输入的二元操作符代替相等的判断。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 4, 5, 6};// Find the first pair of adjacent repeated elementsauto it = std::adjacent_find(numbers.begin(), numbers.end());if (it != numbers.end()) {std::cout << "Found adjacent repeated elements: " << *it << " and " << *(it + 1) << std::endl;} else {std::cout << "No adjacent repeated elements found" << std::endl;}return 0;
}输出:Found adjacent repeated elements: 4 and 4


   binary_search

        在有序序列中查找value,找到返回true。重载的版本实用指定的比较函数对象或函数指针来判断相等。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6};int value = 3;// Check if value exists in the sorted sequencebool found = std::binary_search(numbers.begin(), numbers.end(), value);if (found) {std::cout << "Value " << value << " found" << std::endl;} else {std::cout << "Value " << value << " not found" << std::endl;}return 0;
}输出
Value 3 found


    count 

        利用等于操作符,把标志范围内的元素与输入值比较,返回相等元素个数。

#include <iostream>
#include <algorithm>
#include <vector>int main() {std::vector<int> numbers = {1, 2, 3, 2, 2, 4, 5};int value = 2;// Count the occurrences of value in the rangeint count = std::count(numbers.begin(), numbers.end(), value);std::cout << "Number of occurrences of " << value << ": " << count << std::endl;return 0;
}输出:
Number of occurrences of 2: 3


    count_if 

        利用输入的操作符,对标志范围内的元素进行操作,返回结果为true的个数。

#include <iostream>
#include <algorithm>
#include <vector>bool isEven(int number) {return number % 2 == 0;
}int main() {std::vector<int> numbers = {1, 2, 3, 4, 5, 6};// Count the number of even elements in the rangeint count = std::count_if(numbers.begin(), numbers.end(), isEven);std::cout << "Number of even elements: " << count << std::endl;return 0;
}输出:
Number of even elements: 3


    equal_range

        功能类似equal,返回一对iterator,第一个表示lower_bound,第二个表示upper_bound。

std::vector<int> nums = {1, 2, 3, 4, 4, 5};
auto range = std::equal_range(nums.begin(), nums.end(), 4);
// range.first指向第一个等于4的元素位置,range.second指向第一个大于4的元素位置
// 在这个例子中,range.first指向索引3处的元素(值为4),range.second指向索引5处的元素(值为5)


    find  

        利用底层元素的等于操作符,对指定范围内的元素与输入值进行比较。当匹配时,结束搜索,返回该元素的一个InputIterator。

std::vector<int> nums = {1, 2, 3, 4, 5};
auto it = std::find(nums.begin(), nums.end(), 3);
// it指向索引2处的元素(值为3)


    find_end

        在指定范围内查找"由输入的另外一对iterator标志的第二个序列"的最后一次出现。找到则返回最后一对的第一个ForwardIterator,否则返回输入的"另外一对"的第一个ForwardIterator。重载版本使用用户输入的操作符代替等于操作。

std::vector<int> nums = {1, 2, 3, 4, 1, 2, 3, 4};
std::vector<int> subseq = {3, 4};
auto it = std::find_end(nums.begin(), nums.end(), subseq.begin(), subseq.end());
// it指向索引6处的元素(值为3),即最后一次出现子序列{3, 4}的位置

   find_first_of        

        在指定范围内查找"由输入的另外一对iterator标志的第二个序列"中任意一个元素的第一次出现。重载版本中使用了用户自定义操作符。

std::vector<int> nums = {1, 2, 3, 4, 5};
std::vector<int> search_nums = {4, 6};
auto it = std::find_first_of(nums.begin(), nums.end(), search_nums.begin(), search_nums.end());
// it指向索引3处的元素(值为4),即首次出现search_nums中任意一个元素{4, 6}的位置


    find_if  

        使用输入的函数代替等于操作符执行find。

std::vector<int> nums = {1, 2, 3, 4, 5};
auto it = std::find_if(nums.begin(), nums.end(), [](int num) { return num % 2 == 0; });
// it指向索引1处的元素(值为2),即第一个满足条件(num % 2 == 0)的元素的位置


    lower_bound

         返回一个ForwardIterator,指向在有序序列范围内的可以插入指定值而不破坏容器顺序的第一个位置。重载函数使用自定义比较操作。

std::vector<int> nums = {1, 2, 3, 4, 5};
auto it = std::lower_bound(nums.begin(), nums.end(), 4);
// it指向索引3处的元素(值为4),即第一个大于等于4的元素的位置


    upper_bound

        返回一个ForwardIterator,指向在有序序列范围内插入value而不破坏容器顺序的最后一个位置,该位置标志一个大于value的值。重载函数使用自定义比较操作。

std::vector<int> nums = {1, 2, 3, 4, 5};
auto it = std::upper_bound(nums.begin(), nums.end(), 4);
// it指向索引4处的元素(值为5),即第一个大于4的元素的位置


    search:

         给出两个范围,返回一个ForwardIterator,查找成功指向第一个范围内第一次出现子序列(第二个范围)的位置,查找失败指向last1。重载版本使用自定义的比较操作。

#include <iostream>
#include <algorithm>
#include <vector>bool customCompare(int a, int b) {// 自定义比较函数,检查是否a和b相差为1return (std::abs(a - b) == 1);
}int main() {std::vector<int> vec1 {1, 2, 3, 4, 5};std::vector<int> vec2 {3, 4};auto it = std::search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end());if (it != vec1.end()) {std::cout << "子序列在位置 " << std::distance(vec1.begin(), it) << " 处找到" << std::endl;} else {std::cout << "未找到子序列" << std::endl;}// 使用自定义比较函数it = std::search(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), customCompare);if (it != vec1.end()) {std::cout << "子序列在位置 " << std::distance(vec1.begin(), it) << " 处找到" << std::endl;} else {std::cout << "未找到子序列" << std::endl;}return 0;
}


    search_n

        在指定范围内查找val出现n次的子序列。重载版本使用自定义的比较操作。

#include <iostream>
#include <algorithm>
#include <vector>bool customCompare(int a, int b) {// 自定义比较函数,检查是否a和b相差为1return (std::abs(a - b) == 1);
}int main() {std::vector<int> numbers {1, 2, 3, 4, 5, 6, 7, 8, 9};// 在numbers中查找连续出现3个值为2的子序列auto it = std::search_n(numbers.begin(), numbers.end(), 3, 2);if (it != numbers.end()) {std::cout << "Found the subsequence at index: "<< std::distance(numbers.begin(), it) << std::endl;} else {std::cout << "Subsequence not found!" << std::endl;}// 使用自定义比较函数在numbers中查找连续出现3个相邻的元素it = std::search_n(numbers.begin(), numbers.end(), 3, 0, customCompare);if (it != numbers.end()) {std::cout << "Found the subsequence at index: "<< std::distance(numbers.begin(), it) << std::endl;} else {std::cout << "Subsequence not found!" << std::endl;}return 0;
}

相关文章:

STL——查找算法及实例

一 前言 STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>&#xff0c;对于数值算法须包含<numeric>&#xff0c;<functional>中则定义了一些模板类&#xff0c;用来声明…...

Ant Design Form.List基础用法

使用 Form.List 使用 项目中需要在新增可以多个如图 代码如下 // An highlighted block <Card title"产品信息" bordered{false}><Form.List name"productList" >{(fields, {add, remove}) > (<>{fields.map((field) > (<Ro…...

怎么优化H5让它可以在300ms以内打开?

移动端H5点击300毫秒延迟问题是由于浏览器为了区分单击和双击事件而导致的&#xff0c;通常会在点击后等待300毫秒以查看是否还会发生第二次点击。为解决这个问题&#xff0c;可以采取以下方法&#xff1a; 使用meta标签: 在HTML文档的头部添加以下meta标签来禁用缩放和调整浏览…...

Zabbix安装出现必要条件检查失败

问题描述 今天在某朋友部署新环境的Zabbix时&#xff0c;系统出现如下的检查失败情况。此环境的基础部分不是我负责&#xff0c;而是其它项目共存的PHP环境&#xff0c;也是挺奇怪的。一般来说&#xff0c;不应该将zabbix与其它系统部署在一起&#xff0c;没有条件哪怕时Docke…...

精通Maven的捷径:一文包揽所有必知必学

Maven是每个Java程序都会遇到的包管理工具&#xff0c;今天整理一下Maven的相关知识&#xff0c;从青铜到王者&#xff0c;一文全了解&#xff0c;我们开始吧&#xff01; 1、maven是什么&#xff0c;为什么存在&#xff1f;项目结构是什么样子&#xff0c;怎么定位jar 官方网…...

SpringCloud溯源——从单体架构到微服务Microservices架构 分布式和微服务 为啥要用微服务

前言 单体架构好好的&#xff0c;为啥要用微服务呢&#xff1f;微服务究竟是啥&#xff0c;怎么来的&#xff0c;有啥优缺点&#xff0c;本篇博客尝试追根溯源&#xff0c;阐述单体应用到分布式&#xff0c;微服务的演变,微服务架构的定义及优缺点&#xff0c;厘清相关的概念。…...

springboot 配置 servlet filter 2

springboot 配置 servlet filter 2 以配置Druid为例 Servlet WebServlet(urlPatterns "/druid/*",initParams {WebInitParam(name "loginUsername", value "admin"),// 登录用户名WebInitParam(name "loginPassword", value …...

前端axios下载导出文件工具封装

使用示例&#xff1a; import { fileDownload } from /utils/fileDownloadfileDownload({ url: process.env.VUE_APP_BASE_URL /statistic/pageList/export, method: post, data: data })工具类&#xff1a; import store from ../store/index import {getAccessToken } fro…...

Web应用防火墙的性能优化技术

Web应用防火墙&#xff08;WAF&#xff09;是企业网络安全的重要屏障&#xff0c;其性能直接影响到网络服务的质量和安全。本文详细探讨了WAF性能优化的几种技术&#xff0c;旨在为网络安全专业人员提供实用的参考。 规则优化 1.1 精简规则集 规则评估&#xff1a;定期评估规…...

华为HCIP题库h12-821题库新增30题

901、 &#xff08;多选题&#xff09;下面关于BGP中的公认属性的描述&#xff0c;正确的是 A、公认必属性是所有BGP路由器都识别&#xff0c;且必须存在于Updata消息中 B、BGP必须识别所有公认属性 C、公认属性分为公认必遵和可选过渡两种 D、公认任意属性是所有BGP造由器…...

智慧办公数据可视化大屏设计(数据可视化)、大数据、数据大屏、办公数据大屏、办公数据

本次分享的作品是用软件Axure8.0&#xff08;兼容9和10&#xff09;制作的智慧办公数据进行的可视化大屏设计&#xff0c;主要是针对办公的综合数据、工位数据、会议室数据、访客数据、能耗数据以及设备智控数据进行可视化数据分析。 1、综合分析:对办公室的整体数据、空气质量…...

echarts实现横轴刻度名倾斜展示,并且解决文字超出部分消失问题

需求背景&#xff1a; xAxis.axisLabel. interval如果不手动设值的话&#xff0c;默认就是‘auto’&#xff0c;会采用标签不重叠的策略间隔显示标签。当数据量特别大的时候&#xff0c;展示出来的刻度标签就会很少&#xff0c;导致用户体验不好。如下图所示&#xff1a; 如果…...

awk常用统计命令

统计列的某元素个数 # 统计第4列为0的个数 awk $4 0 { count } END { print count } your_file.txt awk $4 0 { print } your_file.txt # 第4列为0的行打印到屏幕 awk $4 0 your_file.txt...

Linux:【Kafka四】集群介绍与单机搭建

目录 环境简介 一、搭建kafka集群 1.1、复制出两个kafka的配置文件 1.2、修改配置文件中的如下属性 二、启动kafka集群 三、可校验kafka三个节点是否均启动成功 四、查看集群中主题的分区和副本 4.1、新建一个包含了分区和副本的主题 4.2、查看该主题的详细信息 五、…...

代码随想录算法训练营Day52|动态规划11

代码随想录算法训练营Day52|动态规划11 文章目录 代码随想录算法训练营Day52|动态规划11一、123.买卖股票的最佳时机III二、188.买卖股票的最佳时机IV 买卖股票 难 一、123.买卖股票的最佳时机III class Solution {public int maxProfit(int[] prices) {int[] dp new int[4]…...

Android渲染系列之原理概述篇

屏幕硬件 渲染离不开屏幕&#xff0c;Android中的屏幕碎片化比较严重&#xff0c;尺寸大小不一&#xff0c;材质也是屏幕重要的因素。 目前智能手机主流的屏幕可分为两大类即液晶显示器; LCD (Liquid Crystal Display) 液晶显示器OLED (Organic Light Emitting Diode&#xf…...

类图 UML从入门到放弃系列之二

1.劝退说明(开个玩笑) UML包含有许多小组件、修饰符以及其他小巧复杂的东西。UML的内容相当庞大&#xff0c;以至于你可以花大量的时间把自己修成一个UML语言律师&#xff0c;并能够完成所有律师能够完成的工作&#xff1a;编写出所有人都无法理解的文档。现在流行的敏捷开发倡…...

诊断用抗原抗体——博迈伦

抗原抗体诊断是一种常见的临床诊断方法&#xff0c;它通过检测人体内特定抗原或抗体的存在来确定某种疾病或感染的存在与否。这种诊断方法可以用于许多不同的疾病和感染的检测&#xff0c;如传染病、自身免疫病、肿瘤等。 抗原抗体诊断的原理是基于抗原与抗体之间的特异性反应。…...

156 - Ananagrams (UVA)

题目链接如下&#xff1a; Online Judge 我的代码如下&#xff1a; #include <iostream> #include <string> #include <vector> #include <map> #include <algorithm> // #define debugint main(){#ifdef debugfreopen("0.txt", &q…...

vue3入门

一. Vue3的优势 二. 使用create-vue搭建Vue3项目 2.1 认识create-vue create-vue是Vue官方新的脚手架工具&#xff0c;底层切换到了 vite &#xff08;下一代前端工具链&#xff09;&#xff0c;为开发提供极速响应 2.2 使用create-vue创建项目 前置条件 - 已安装16.0或更高版…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

【2025年】解决Burpsuite抓不到https包的问题

环境&#xff1a;windows11 burpsuite:2025.5 在抓取https网站时&#xff0c;burpsuite抓取不到https数据包&#xff0c;只显示&#xff1a; 解决该问题只需如下三个步骤&#xff1a; 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

鸿蒙(HarmonyOS5)实现跳一跳小游戏

下面我将介绍如何使用鸿蒙的ArkUI框架&#xff0c;实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...

C++实现分布式网络通信框架RPC(2)——rpc发布端

有了上篇文章的项目的基本知识的了解&#xff0c;现在我们就开始构建项目。 目录 一、构建工程目录 二、本地服务发布成RPC服务 2.1理解RPC发布 2.2实现 三、Mprpc框架的基础类设计 3.1框架的初始化类 MprpcApplication 代码实现 3.2读取配置文件类 MprpcConfig 代码实现…...

echarts使用graphic强行给图增加一个边框(边框根据自己的图形大小设置)- 适用于无法使用dom的样式

pdf-lib https://blog.csdn.net/Shi_haoliu/article/details/148157624?spm1001.2014.3001.5501 为了完成在pdf中导出echarts图&#xff0c;如果边框加在dom上面&#xff0c;pdf-lib导出svg的时候并不会导出边框&#xff0c;所以只能在echarts图上面加边框 grid的边框是在图里…...