C++学习笔记(三十七)——STL之搜索算法

news2025/4/25 14:34:13

STL 算法分类:

类别常见算法作用
排序sortstable_sortpartial_sortnth_element排序
搜索findfind_ifcountcount_ifbinary_search查找元素
修改copyreplacereplace_ifswapfill修改容器内容
删除removeremove_ifunique删除元素
归约for_eachaccumulate处理数据
合并mergeset_unionset_intersection处理有序序列
排列组合next_permutationprev_permutation生成排列
堆操作push_heappop_heapmake_heapsort_heap处理堆

STL 搜索算法

C++的STL 中,提供了一些用于搜索容器中元素的算法,位于 <algorithm> 头文件中。
常见的搜索算法包括 findbinary_searchfind_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适用于顺序容器(如 vectorlist 等)。

(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); // 查找是否有 3
    cout << (found ? "找到" : "未找到") << endl;  // 输出:找到

    found = binary_search(vec.begin(), vec.end(), 4); // 查找是否有 4
    cout << (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 次的元素 2
    auto 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适用于查找某个值连续出现的子序列。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2342491.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FPGA上实现YOLOv5的一般过程

在FPGA上实现YOLOv5 YOLO算法现在被工业界广泛的应用&#xff0c;虽说现在有很多的NPU供我们使用&#xff0c;但是我们为了自己去实现一个NPU所以在本文中去实现了一个可以在FPGA上运行的YOLOv5。 YOLOv5的开源代码链接为 https://github.com/ultralytics/yolov5 为了在FPGA中…

4U带屏基于DSP/ARM+FPGA+AI的电力故障录波装置设计方案,支持全国产化

4U带屏DSP/ARMFPGAAI电力故障录波分析仪&#xff0c;支持国产化&#xff0c;含有CPU主控模块&#xff0c;96路模拟量采集&#xff0c;256路开关量&#xff0c;通讯扩展卡等#电力故障录波#4U带屏#新能源#电力监测 主要特点 1&#xff09;是采用嵌入式图形系统&#xff0c;以及…

数据库数据删除与修改实验

数据库数据删除与修改实验 在数据库原理的学习中&#xff0c;数据的删除与修改是核心操作技能。通过“删除修改数据”实验&#xff0c;我系统实践了 SQL 中 UPDATE 和 DELETE 语句的多种应用场景&#xff0c;从基础语法到复杂业务逻辑处理&#xff0c;积累了丰富的实战经验。本…

【含文档+PPT+源码】基于SpringBoot+vue的疫苗接种系统的设计与实现

项目介绍 本课程演示的是一款 基于SpringBootvue的疫苗接种系统的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…

项目自动化测试

一.设计测试用例(细致全面) 二.先引入所需要的pom.xml依赖 1.selenium依赖 2.webdrivermanager依赖 3.commons-io依赖 编写测试用例–按照页面对用例进行划分,每个页面是Java文件,页面下的所有用例统一管理 三.common包(放入公用包) 类1utils 可以调用driver对象,访问url …

Python爬虫爬取图片并存储到MongoDB(注意:仅尝试存储一条空的示例数据到MongoDB,验证MongoDB的联通性)

以下是一个使用Python爬取图片并存储到MongoDB的示例实现&#xff0c;包含详细步骤说明&#xff1a; import requests from bs4 import BeautifulSoup from pymongo import MongoClient from datetime import datetime import os import re# 配置信息 mongoIP mongodb://root…

L1-1、Prompt 是什么?为什么它能“控制 AI”?

*Prompt 入门 L1-1 想象一下&#xff0c;你只需输入一句话&#xff0c;AI 就能自动为你写一篇文案、生成一份报告、甚至规划你的创业计划。这种“对话即编程”的背后魔法&#xff0c;就是 Prompt 的力量。 &#x1f50d; 一、Prompt 的定义与由来 Prompt&#xff08;提示词&am…

TIM输入捕获知识部分

越往左&#xff0c;频率越高&#xff1b;越往右&#xff0c;频率越低。【越紧凑&#xff0c;相同时间&#xff0c;次数越多】 计算频率的方法&#xff1a;测评法、测周法、中界频率。 频率的定义&#xff1a;1s内出现了多少个重复的周期 测评法就是从频率的定义出发的&#…

PCB常见封装类型

1. 电阻、电容、电感封装 2. 二极管、三极管封 3. 排阻类器件&#xff08;8脚、16脚&#xff09;封装 4. SO类器件&#xff08;间距有1.27、2.54mm等&#xff09;封装 5. QFP类器件封装&#xff08;四方扁平封装&#xff09; 结构&#xff1a;引脚分布在封装的四个侧面&#…

【Linux】调试工具gdb的认识和使用指令介绍(图文详解)

目录 1、debug和release的知识 2、gdb的使用和常用指令介绍&#xff1a; &#xff08;1&#xff09;、windows下调试的功能&#xff1a; &#xff08;2&#xff09;、进入和退出&#xff1a; &#xff08;3&#xff09;、调试过程中的相关指令&#xff1a; 3、调试究竟是在…

UML设计系列(9):开发过程中如何应用UML

传送门 UML设计系列(1)&#xff1a;状态机图 UML设计系列(2)&#xff1a;类图 UML设计系列(3)&#xff1a;时序图 UML设计系列(4)&#xff1a;用例图 UML设计系列(5)&#xff1a;系统依赖图 UML设计系列(6)&#xff1a;活动图 UML设计系列(7)&#xff1a;UML设计阶段性总…

模板方法模式:定义算法骨架的设计模式

模板方法模式&#xff1a;定义算法骨架的设计模式 一、模式核心&#xff1a;模板方法定义算法骨架&#xff0c;具体步骤延迟到子类实现 在软件开发中&#xff0c;经常会遇到这样的情况&#xff1a;某个算法的步骤是固定的&#xff0c;但具体步骤的实现可能因不同情况而有所不…

通付盾入选苏州市网络和数据安全免费体验目录,引领企业安全能力跃升

近日&#xff0c;苏州市网络安全主管部门正式发布《苏州市网络和数据安全免费体验产品和服务目录》&#xff0c;通付盾凭借其在数据安全、区块链、AI领域的创新实践和前沿技术实力&#xff0c;成功入选该目录。 作为苏州市网络安全技术支撑单位&#xff0c;通付盾将通过 “免费…

【金仓数据库征文】加速数字化转型:金仓数据库在金融与能源领域强势崛起

目录 一、引言 二、金仓数据库&#xff08;KingbaseES&#xff09;概述 1. 发展历程与市场地位 2. 核心技术架构 3. 金仓数据库的特点 三、金仓数据库在金融行业的应用 1. 金融行业的挑战与需求 2. 金仓数据库在金融行业的优势 3. 金仓数据库在金融行业的实际应用案例 …

C++智能指针上

一、裸指针 “裸指针”是最基础的&#xff0c;直接存储内存地址的指针类型。特点&#xff1a;①它本身没有自动的内存管理机制&#xff1a;如它不会自动释放内存&#xff0c;也不会检查是否指向有效的内存区域&#xff1b;②直接操作内存地址&#xff0c;不进行任何的边界检查&…

低代码平台开发串口调试助手

项目介绍 串口调试助手是一款用于串口通信调试的工具&#xff0c;它可以帮助开发人员发送和接收串口数据&#xff0c;主要用于嵌入式开发、工业控制、物联网设备开发等领域。 主要功能包括&#xff1a; 数据收发&#xff1a;可以实时发送和接收串口数据&#xff0c;并显示在界…

怎么配置一个kubectl客户端访问多个k8s集群

怎么配置一个kubectl客户端访问多个k8s集群 为什么有的客户端用token也访问不了k8s集群&#xff0c;因为有的是把~/.kube/config文件&#xff0c;改为了~/.kube/.config文件&#xff0c;文件设置成隐藏文件了。 按照kubectl的寻找配置的逻辑&#xff0c;kubectl找不到要访问集群…

12N60-ASEMI无人机专用功率器件12N60

编辑&#xff1a;LL 12N60-ASEMI无人机专用功率器件12N60 型号&#xff1a;12N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;12A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;0.68…

长城智驾重复造轮子

左手新能源&#xff0c;右手智驾&#xff0c;这是长城当下最在意的两块业务。 从去年8月首款具备高阶智能驾驶功能SUV全新蓝山上市之后&#xff0c;长城在传播端的重点就是围绕智驾、无图方案打造智驾标签。 先是在广州国际车展上&#xff0c;整个展厅只展出全新蓝山&#xf…

continue插件实现IDEA接入本地离线部署的deepseek等大模型

文章目录 前言一、IDEA安装continue二、continue部署本地大模型三、continue聊天窗口使用deepseek R1四、continue批量接入硅基流动的模型API 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0c;您的关注是我…