C++学习笔记(三十七)——STL之搜索算法
STL 算法分类:
| 类别 | 常见算法 | 作用 |
|---|---|---|
| 排序 | sort、stable_sort、partial_sort、nth_element等 | 排序 |
| 搜索 | find、find_if、count、count_if、binary_search等 | 查找元素 |
| 修改 | copy、replace、replace_if、swap、fill等 | 修改容器内容 |
| 删除 | remove、remove_if、unique等 | 删除元素 |
| 归约 | for_each、accumulate等 | 处理数据 |
| 合并 | merge、set_union、set_intersection等 | 处理有序序列 |
| 排列组合 | next_permutation、prev_permutation等 | 生成排列 |
| 堆操作 | push_heap、pop_heap、make_heap、sort_heap等 | 处理堆 |
STL 搜索算法
在 C++的STL 中,提供了一些用于搜索容器中元素的算法,位于 <algorithm> 头文件中。
常见的搜索算法包括 find、binary_search、find_if 等。
| 算法名称 | 功能描述 | 时间复杂度 | 空间复杂度 | 适用场景 |
|---|---|---|---|---|
find | 查找容器中第一个与指定值相等的元素 | O(n) | O(1) | 在无序容器中查找元素 |
find_if | 查找容器中第一个满足指定条件的元素 | O(n) | O(1) | 查找满足特定条件的元素 |
count | 统计某个元素在范围内出现的次数 | O(n) | O(1) | 统计某个元素出现的次数 |
count_if | 统计满足特定条件的元素数量 | O(n) | O(1) | 统计符合条件的元素数量 |
binary_search | 查找容器中是否存在某个元素(要求容器已排序) | O(log n) | O(1) | 在已排序的容器中查找元素 |
lower_bound | 查找容器中第一个不小于指定值的元素 | O(log n) | O(1) | 在已排序的容器中查找不小于指定值的元素 |
upper_bound | 查找容器中第一个大于指定值的元素 | O(log n) | O(1) | 在已排序的容器中查找大于指定值的元素 |
search | 查找一个子序列在另一个序列中的首次出现 | O(n * m) | O(1) | 查找子序列在容器中的位置 |
search_n | 查找某个值连续出现 n 次的子序列 | O(n) | O(1) | 查找某个值连续出现的子序列 |
(1) find
- 功能:在容器中查找第一个与指定值相等的元素。
- 时间复杂度:O(n),其中
n是容器中的元素数。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 5, 2, 8, 3, 1 };auto it = find(vec.begin(), vec.end(), 3); // 查找值为 3 的元素if (it != vec.end()){cout << "找到元素: " << *it << endl; // 输出:找到元素: 3}else{cout << "元素未找到" << endl;}system("pause");return 0;
}
注意:
find适用于顺序容器(如vector、list等)。
(2)find_if
- 功能:在容器中查找第一个满足给定条件的元素。
- 时间复杂度:O(n),其中
n是容器中的元素数。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>bool is_even(int n)
{return n % 2 == 0; // 判断是否为偶数
}int main() {vector<int> vec = { 5, 2, 8, 3, 1 };auto it = find_if(vec.begin(), vec.end(), is_even); // 查找第一个偶数if (it != vec.end()){cout << "找到偶数: " << *it << endl; // 输出:找到偶数: 2}else{cout << "未找到偶数" << endl;}system("pause");return 0;
}
注意:
- 与
find不同,find_if是基于条件的查找,使用一个谓词(即一个返回布尔值的函数或仿函数)来判断元素是否满足条件。
(3) count
- 功能:计算给定范围内某个元素出现的次数。
- 时间复杂度:O(n),其中
n是范围中的元素数量。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 10, 20, 10, 40, 10 };// 统计 10 出现的次数int num = count(vec.begin(), vec.end(), 10);cout << "元素 10 出现了 " << num << " 次。" << endl;system("pause");return 0;
}
注意:
count适用于,当需要统计某个元素在容器中出现的次数时使用。
(4) count_if
- 功能:计算给定范围内满足特定条件的元素的数量。
- 时间复杂度:O(n),其中
n是范围中的元素数量。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>bool is_even(int n)
{return n % 2 == 0;
}int main() {vector<int> vec = { 1, 2, 3, 4, 5, 6 };// 统计偶数元素的数量int num = count_if(vec.begin(), vec.end(), is_even);cout << "有 " << num << " 个偶数元素。" << endl;system("pause");return 0;
}
注意:
count_if适用于,当需要统计满足某个条件的元素数量时使用。
(5) binary_search
- 功能:判断容器中是否存在某个元素,要求容器必须已经是有序的。
- 时间复杂度:O(log n),
n是容器中的元素数。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 3, 5, 8 }; // 已经排序bool found = binary_search(vec.begin(), vec.end(), 3); // 查找是否有 3cout << (found ? "找到" : "未找到") << endl; // 输出:找到found = binary_search(vec.begin(), vec.end(), 4); // 查找是否有 4cout << (found ? "找到" : "未找到") << endl; // 输出:未找到system("pause");return 0;
}
注意:
binary_search适用于有序容器。它返回布尔值,表示是否找到目标元素。
(6)lower_bound
- 功能:返回指向容器中第一个不小于指定值的元素的迭代器。
- 时间复杂度:O(log n),
n是容器中的元素数。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 3, 5, 8 }; // 已经排序auto it = lower_bound(vec.begin(), vec.end(), 3); // 查找大于等于 3 的第一个元素if (it != vec.end()) {cout << "找到元素: " << *it << endl; // 输出:找到元素: 3}else{cout << "未找到元素" << endl;}system("pause");return 0;
}
注意:
lower_bound适用于有序容器。它可以用来查找某个值或第一个大于等于该值的元素。
(7)upper_bound
- 功能:返回指向容器中第一个大于指定值的元素的迭代器。
- 时间复杂度:O(log n),
n是容器中的元素数。 - 空间复杂度:O(1),原地操作。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 3, 5, 8 }; // 已经排序auto it = upper_bound(vec.begin(), vec.end(), 3); // 查找大于 3 的第一个元素if (it != vec.end()){cout << "找到元素: " << *it <<endl; // 输出:找到元素: 5}else{cout << "未找到元素" << endl;}system("pause");return 0;
}
注意:
upper_bound适用于有序容器。它返回一个迭代器,指向第一个比指定值大的元素。
(8) search
- 功能:在一个范围中查找另一个范围(子序列)的第一次出现。
- 时间复杂度:O(n * m),其中
n是第一个范围的大小,m是第二个范围的大小。 - 空间复杂度:O(1)。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 3, 4, 5, 6 };vector<int> subvec = { 3, 4 };// 查找子序列 subvec 在 vec 中的首次出现auto it = std::search(vec.begin(), vec.end(), subvec.begin(), subvec.end());if (it != vec.end()){cout << "子序列 subvec 在 vec 中的首次出现的位置: " << distance(vec.begin(), it) << endl;}else{cout << "未找到子序列subvec" << endl;}system("pause");return 0;
}
注意:
search适用于查找一个子序列在另一个序列中的位置。
(9) search_n
- 功能:在给定范围内查找一个值连续出现的子序列(即连续
n次相同的元素)。 - 时间复杂度:O(n),其中
n是范围中的元素数量。 - 空间复杂度:O(1)。
示例:
#include <iostream>
using namespace std;
#include <vector>
#include <algorithm>int main() {vector<int> vec = { 1, 2, 2, 2, 3, 4 };// 查找连续出现 3 次的元素 2auto it = search_n(vec.begin(), vec.end(), 3, 2);if (it != vec.end()){cout << "连续出现 3 次的元素 2 的首次出现的位置: " << distance(vec.begin(), it) << endl;}else{cout << "未找到连续出现 3 次的元素 2" << endl;}system("pause");return 0;
}
注意:
search_n适用于查找某个值连续出现的子序列。
相关文章:
C++学习笔记(三十七)——STL之搜索算法
STL 算法分类: 类别常见算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器内容删除remove、remove_if、unique等删除元素归约for…...
MySQL 9.3 正式发布!备份、用户管理与开发支持迎来革命性升级
开源数据库领域的标杆产品MySQL迎来重大更新——MySQL 9.3正式发布!作为企业级数据库的“扛把子”,此次版本更新聚焦备份效率、用户管理精细化、开发支持增强三大核心领域,同时在高可用性和性能优化上实现突破。以下为你逐一解读新版本的亮点…...
FPGA上实现YOLOv5的一般过程
在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用,虽说现在有很多的NPU供我们使用,但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…...
4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化
4U带屏DSP/ARMFPGAAI电力故障录波分析仪,支持国产化,含有CPU主控模块,96路模拟量采集,256路开关量,通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1)是采用嵌入式图形系统,以及…...
数据库数据删除与修改实验
数据库数据删除与修改实验 在数据库原理的学习中,数据的删除与修改是核心操作技能。通过“删除修改数据”实验,我系统实践了 SQL 中 UPDATE 和 DELETE 语句的多种应用场景,从基础语法到复杂业务逻辑处理,积累了丰富的实战经验。本…...
【含文档+PPT+源码】基于SpringBoot+vue的疫苗接种系统的设计与实现
项目介绍 本课程演示的是一款 基于SpringBootvue的疫苗接种系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...
如何将IDP映射属性添加,到accountToken中 方便项目获取登录人信息
✅ 目标 你想要: 用户通过 IdP 登录(SAML 或 OAuth2)Keycloak 自动将 IdP 返回的属性(如:email、name、role 等)映射到用户账户中并把这些属性加入到用户登录返回的 Access Token 中,供业务系…...
项目自动化测试
一.设计测试用例(细致全面) 二.先引入所需要的pom.xml依赖 1.selenium依赖 2.webdrivermanager依赖 3.commons-io依赖 编写测试用例–按照页面对用例进行划分,每个页面是Java文件,页面下的所有用例统一管理 三.common包(放入公用包) 类1utils 可以调用driver对象,访问url …...
Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)
以下是一个使用Python爬取图片并存储到MongoDB的示例实现,包含详细步骤说明: import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import os import re# 配置信息 mongoIP mongodb://root…...
Unocss 类名基操, tailwindcss 类名
这里只列出 unocss 的可实现类名,tailwindcss 可以拿去试试用 1. 父元素移入,子元素改样式 <!-- 必须是 group 类名 --> <div class"group"><div class"group-hover:color-red">Text</div> </div>2…...
Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介
Sharding-JDBC 系列专题 - 第七篇:Spring Boot 集成与 Sharding-Proxy 简介 本系列专题旨在帮助开发者全面掌握 Sharding-JDBC,一个轻量级的分布式数据库中间件。本篇作为系列的第七篇文章,将重点探讨 Sharding-JDBC 与 Spring Boot 的集成,以及 Sharding-Proxy 的基本概念…...
微服务划分的思考
为什么 微服务不是十全十美的,不是银弹,是什么原因导致必须要做微服务划分,是否有足够的动机支撑,是项目需要,还是领导的想法,公司层面是否有相应的规划。 拆分后的服务谁来维护,研发同学是否愿意参与 为什么,思考清楚了,接下来看还需要考虑怎么做 单体应用的不足…...
L1-1、Prompt 是什么?为什么它能“控制 AI”?
*Prompt 入门 L1-1 想象一下,你只需输入一句话,AI 就能自动为你写一篇文案、生成一份报告、甚至规划你的创业计划。这种“对话即编程”的背后魔法,就是 Prompt 的力量。 🔍 一、Prompt 的定义与由来 Prompt(提示词&am…...
TIM输入捕获知识部分
越往左,频率越高;越往右,频率越低。【越紧凑,相同时间,次数越多】 计算频率的方法:测评法、测周法、中界频率。 频率的定义:1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…...
Ubuntu使用war包部署Jenkins并通过systemcl管理
目录 一、当前系统环境 二、安装Java 二、安装Jenkins 三、使用systemctl管理 一、当前系统环境 操作系统:ubuntu 24.04 Jenkins版本:2.506 格式:war JDK版本:OpenJDK_17 二、安装Java 1.下载jdk安装包 # wget下载 wget …...
PCB常见封装类型
1. 电阻、电容、电感封装 2. 二极管、三极管封 3. 排阻类器件(8脚、16脚)封装 4. SO类器件(间距有1.27、2.54mm等)封装 5. QFP类器件封装(四方扁平封装) 结构:引脚分布在封装的四个侧面&#…...
济南国网数字化培训班学习笔记-第二组-3节-电网工程建设项目部门
电网工程建设项目部 组成 监理项目部 履行监理合同,监理单位派驻:负责合同管理,审查,见证,旁站,巡视,验收,控制进度,安全,质量,协调各方 造价…...
【Linux】调试工具gdb的认识和使用指令介绍(图文详解)
目录 1、debug和release的知识 2、gdb的使用和常用指令介绍: (1)、windows下调试的功能: (2)、进入和退出: (3)、调试过程中的相关指令: 3、调试究竟是在…...
Vue3 ref与props
ref 属性 与 props 一、核心概念对比 特性ref (标签属性)props作用对象DOM 元素/组件实例组件间数据传递数据流向父组件访问子组件/DOM父组件 → 子组件响应性直接操作对象单向数据流(只读)使用场景获取 DOM/调用子组件方法组件参数传递Vue3 变化不再自…...
UML设计系列(9):开发过程中如何应用UML
传送门 UML设计系列(1):状态机图 UML设计系列(2):类图 UML设计系列(3):时序图 UML设计系列(4):用例图 UML设计系列(5):系统依赖图 UML设计系列(6):活动图 UML设计系列(7):UML设计阶段性总…...
Linux之安装配置Nginx
Linux系统下安装配置Nginx的详细步骤如下: 一、准备工作 系统环境:确保Linux系统已安装,并且具有网络连接(以便在线安装依赖或下载Nginx)。 安装依赖:Nginx依赖于一些开发库和工具,如gcc、pcr…...
【C++】STL之deque
deque Deque 的底层既不直接依赖 vector 也不依赖 list,而是结合了两者的思想,采用了一种分块(chunk)存储与动态指针数组(map)结合的结构。以下是详细分析: 1. 底层结构设计 Deque 的核心设计…...
模板方法模式:定义算法骨架的设计模式
模板方法模式:定义算法骨架的设计模式 一、模式核心:模板方法定义算法骨架,具体步骤延迟到子类实现 在软件开发中,经常会遇到这样的情况:某个算法的步骤是固定的,但具体步骤的实现可能因不同情况而有所不…...
通付盾入选苏州市网络和数据安全免费体验目录,引领企业安全能力跃升
近日,苏州市网络安全主管部门正式发布《苏州市网络和数据安全免费体验产品和服务目录》,通付盾凭借其在数据安全、区块链、AI领域的创新实践和前沿技术实力,成功入选该目录。 作为苏州市网络安全技术支撑单位,通付盾将通过 “免费…...
【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起
目录 一、引言 二、金仓数据库(KingbaseES)概述 1. 发展历程与市场地位 2. 核心技术架构 3. 金仓数据库的特点 三、金仓数据库在金融行业的应用 1. 金融行业的挑战与需求 2. 金仓数据库在金融行业的优势 3. 金仓数据库在金融行业的实际应用案例 …...
音频base64
音频 Base64 是一种将二进制音频数据(如 MP3、WAV 等格式)编码为 ASCII 字符串的方法。通过 Base64 编码,音频文件可以转换为纯文本形式,便于在文本协议(如 JSON、XML、HTML 或电子邮件)中传输或存储&#…...
Qt C++/Go/Python 面试题(持续更新)
目录 1、封装、继承、多态是什么? 2、final标识符的作用是什么? 3、介绍一下虚函数 4、介绍一下智能指针 5、介绍一下左值、右值、左值引用、右值引用 6、指针和引用有什么区别? 7、define和const的区别是什么? 8、C程序的…...
VMware 虚拟机镜像资源网站
常见的 VMware 虚拟机镜像资源网站 网站名称链接地址特点OSBoxes.orgOSBoxes - Virtual Machines for VirtualBox & VMware 提供 .vmx .vmdk,适合 VMware 和 VirtualBox,更新频率高,界面清晰LinuxVMImages.comLinux VM Images - Downlo…...
C++智能指针上
一、裸指针 “裸指针”是最基础的,直接存储内存地址的指针类型。特点:①它本身没有自动的内存管理机制:如它不会自动释放内存,也不会检查是否指向有效的内存区域;②直接操作内存地址,不进行任何的边界检查&…...
低代码平台开发串口调试助手
项目介绍 串口调试助手是一款用于串口通信调试的工具,它可以帮助开发人员发送和接收串口数据,主要用于嵌入式开发、工业控制、物联网设备开发等领域。 主要功能包括: 数据收发:可以实时发送和接收串口数据,并显示在界…...
