stl algorithms 算法

news2025/1/20 18:23:01

在这里插入图片描述

所有泛型算法,除了少数例外,前两个参数均为一组iterator,用来标识欲遍历容器元素的范围,范围从第一个iterator所指位置开始,至第二个iterator所指位置(并不包括)结束

int arr[3]={1,2,3}
vector<int> v1(arr,arr+3);
sort(v1.begin(),v2.begin());

算法通常有两个重载的版本,版本之一使用底层元素所属之类型的内置运算符,包括equlity运算符和less-than运算符,版本之二接收function object或function pointer的传入。例如,默认情形下sort会使用less-than运算符由低到高进行排序,如果改变这一行为,我们可以传入预先定义好的greater function object

sort(v1.begin(),v1.end())// 由低到高
sort(v1.begin(),v1.end(),greater<int>()) //由高到低

不过另一些算法干脆以不同名称区分不同版本,以形成两个函数,以_if为名称,便可以“指定特定行为的”那个版本。举个例子,如果我们想找出小于10的每一个元素,可以这么写

find_if(vec.begin(),vec.end(),bind2nd(less<int>,10))

许多“会改变容器自身内容”的算法会提供两个版本,一份为in-place(就地)版本,其必会改变容器内容,另一种为copy版本,不改变传入容器的内容,而是先为它制作一份副本,再改变副本的内容,然后返回该副本,例如replace()和replace_copy()两个算法,copy版本接收第三个iterator参数,用以指向改变容器的第一个元素。

头文件

#include<algortihm>
#include<numeric>

stable_sort()

稳定版的排序

stable_sort(vec1.begin(),vec1.end())

acumlate 累加(可以实现 累计 操作)

//累加
int a= accumlate(vec.begin(),vec.end())
//累乘
int b=accumlate(vec.begin(),vec.end(),mutiples<int>())

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U71e3E0b-1673318674195)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/8aa1b2ad-a9e9-4a6e-a793-8238d7eeede7/Untitled.png)]

adjacent_difference() 相邻元素的差值(相邻元素处理)

除了第一个元素为原本的值外,其他元素均代表与上一个元素的差值

如{0,2,3,4,5,6}

返回{0,2,1,1,1,1}

该函数不会改变原本容器内容,第三个参数为新的容器的第一个元素

第四个参数还可以改变 默认的运算符 如 上一个元素与本元素相乘(multiplies) 等等

adjacent_difference(vec1.begin(),vec1.end(),vec2.begin(),multiplies<int>)

adjacent_find() 相邻元素且重复

adjacent_find,在一个数组中寻找两个相邻的元素。如果相等,就返回这两个相等元素第一个元素的迭代器,不等的话,就返回v.end().

adjacent_find(vec1.begin(),vec2.begin())

binary_search() 二元搜索

cpp

cpp外层二分搜索使用STL库的

binary_search bool 如果搜到了该数 则返回True

lower_bound 返回第一个等于或大于该元素的指针

upper_bound 返回第一个大于该元素的指针

若要索引减去指针第一个位置即可

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int a[100]= {4,10,11,30,69,70,96,100};
    int b=binary_search(a,a+9,4);//查找成功,返回1
    cout<<"在数组中查找元素4,结果为:"<<b<<endl;
    int c=binary_search(a,a+9,40);//查找失败,返回0
    cout<<"在数组中查找元素40,结果为:"<<c<<endl;
    int d=lower_bound(a,a+9,10)-a;
    cout<<"在数组中查找第一个大于等于10的元素位置,结果为:"<<d<<endl;
    int e=lower_bound(a,a+9,101)-a;
    cout<<"在数组中查找第一个大于等于101的元素位置,结果为:"<<e<<endl;
    int f=upper_bound(a,a+9,10)-a;
    cout<<"在数组中查找第一个大于10的元素位置,结果为:"<<f<<endl;
    int g=upper_bound(a,a+9,101)-a;
    cout<<"在数组中查找第一个大于101的元素位置,结果为:"<<g<<endl;
}

copy() 复制一个容器的内容到另一容器中

copy(vec1.begin(),vec1.end(),vec2.begin()); //vec1 复制到vec2中

类似于vector的成员函数assign()

copy_backward() 逆向复制

copy_backward(vec1.begin(),vec1.end(),vec2.begin())

count() 计数

count(vec1.begin(),vec1.end(),5);

count() 条件计数

count_if(vec1.begin(),vec1.end(),bind2nd(less<than>,10))
// 比10小的数字个数

equal() 两数列是否相等(不考虑第二数列的多的部分)

相等返回true

不等返回false

第四个参数可传入二元运算符

equal(vec1.begin(),vec1.end(),vec2.begin())
equal(vec1.begin(),vec1.end(),vec2.begin(),Even2())

class Even2
{
	public:
		bool operator2(int val1,int val2){return val1-val2}
}

fill() 将容器内元素更改为某值

fill(vec1.begin(),vec1.end(),10)

fill_n() 更改为n个值

fill(vec1.begin(),count,value)

find() 找到某个值

找到则返回指向该元素的iterator

没找到指向end()

auto l1=find(vec1.begin(),vec1.end(),10)

find_if() 找到满足条件的某个值

第三个参数输入一元运算符

find_if(vec1.begin(),vec1.end(),bind2nd(less<int>,val))

search() 寻找子序列的第一次出现的位置

如果没有该子序列 则返回end()

auto l1=search(l1.begin(),l1.end(),l2.begin(),l2.end())

find_end() 寻找子序列的最后一次出现的位置‘

如果没有该子序列 则返回end()

auto l1=find_end(l1.begin(),l1.end(),l2.begin(),l2.end())

find_first_of 找寻某些元素第一次出现的地点

比如在[1,2,3,4,5,6,7]中找[6,2,5]第一次出现的位置,自然是nums[1]

find_first_of(vec1.begin(),vec1.end(),vec2.begin(),vec2.end())

for_each() 以功能函数遍历不得改变原函数

void newfunction (int k)
{
    std::cout << " " <<k;
}
for_each(vec1.begin(),vec1.end(),newfunction)

transform() 以功能函数遍历容器并赋值给另一个容器

int myfun(int val)
{
	return -val;
}
transform(vec1.begin(),ve1.end(),vec2.begin(),myfun)

includes 线性时间复杂度 在有序序列中找有序元素

		// initializing 1st container
    vector<int> arr1 = { 1, 4, 6, 3, 2 };
 
    // initializing 2nd container
    vector<int> arr2 = { 1, 2, 4 };
 
    // sorting initial containers
    sort(arr1.begin(), arr1.end());
    sort(arr2.begin(), arr2.end());
 
    // using include() check if all elements
    // of arr2 lie in arr1
    // using comparator function
    if (includes(arr1.begin(), arr1.end(), arr2.begin(),
                 arr2.end(), comp))
        cout << "All elements of 2nd container are in 1st "
                "container";
    else
        cout << "All elements of 2nd container are not in "
                "1st container";
    return 0;

inner_product() 两个容器的内积

[1,2,3,4]

[5,6,7,8] 初值+(15)+ (26) +(37)+(48)

inner_product(vec1.begin(),vec1.end(),vec2.begin(),初值)

自定义 单序列元素的符号ar1 两序列元素的符号 ar2

(1 ar2 5)ar1(2 ar2 6) ar1 …

inner_product(vec1.begin(),vec1.end(),vec2.begin(),初值,ar1,ar2)

merge()

合并两个排序后的数列,结果亦经过排序。

可设定默认排序的方式

sort(vec1.begin(),vec1.end(),greater<int>())
sort(vec2.begin(),vec2.end(),greater<int>())
merge(vec1.begin(),vec1.end(),vec2.begin(),vec2.begin(),vec_rs.begin(),greater<int>());

iter_swap 元素互换

iter_swap(it1,it2);

max,min

返回两元素中较大较小者

max_element() min_element()

返回指向较大较小者的迭代器1

auto it =max_element(vec1.begin(),vec1.end())

partial_sum() 累计 斐波那契

[0,0,1,2,3] → [0,0,1,3,6]

该元素与之前所有元素的累加和

赋值给某个容器

partial_sum(a1.begin(),a1.end(),a2.begin())

partial_sort() 堆排序 排前k个数

容器前四个为排好的数

partial_sort(vec1.begin(),vec1.begin()+4,vec1.end())

partial_sort() 堆排序 排前k个数 复制给另一个容器

partial_sort_copy(vec1.begin(),vec1.end(),vec2.begin(),vec2.end())
//通过vec2的长度指明k

remove() 和 erase()

remove 隔离某种元素

erase是vector的成员函数,删除某个范围

vector<int> vec1={0,2,0,,5};
auto it =remove(vec1.begin(),vec1.end(),0). 
//it 指向合格元素的下一个位置,即第一个0
-> vec1=[2,5,0,0]
vec1.erase(it,vec1.end()) // 抹去0, 0

remove_copy() 删除某个元素的序列赋值给另一个序列

[0,2,0,5] 删除0 赋值给vec2 -》 【2,5】

remove_copy(vec1.begin(),vec1.end(),vec2.begin(),0)

remove_if remove_copy_if

用一个单元运算符代替0

auto it= remove_if(vec1.begin(),vec1.end(),func)
remove_copy_if(vec1.begin(),vec1.end(),vec2.begin(),func)

replace()

将old_val 替换成 new_val

replace(vec1.begin(),vec1.end(),oldval,newval)

replace_if()

将满足单元运算符func的替换成newval

replace_if(vec1.begin(),vec1.end(),func,newval)

reverse() reverse_copy()

颠倒原容器

颠倒容器赋值到另一个容器

reverse(vec1.begin(),vec1.end())
reverse(vec1.begin(),vec1.end(),vec2.begin())

unique() unique_copy()

与remove remove_copy类似

复制给vec1

[1,2,3,1,1,3,5]

auto it =unique(vec1.begin(),vec1.end()) ->[1,2,3,5,1,1,3]

把唯一的元素移到前面
可以删除 vec1.erase(it,vec1.end())

unique(vec1.begin(),vec1.end(),vec1.begin())

partition() stable_partition()

所有为true的元素会置于false的元素之前 func为1元运算符

stable为稳定版

partition(vec1.begin(),vec1.end(),func)

random_shuffle()

随机重排
random_shuffle(vec1.begin(),vec1.end())

nth_element()

快排的一部分 将小于某个数的放在其前面,大于它的放在后面

nth_element(vec1.begin(),vec1.end(),vec1.begin()+6)

set_difference() set_intersection set_union

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j0CFY7Ud-1673318674196)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/d763ebcb-fdf0-463f-aa08-c69ee2ec87af/Untitled.png)]


// 交集
set_intersection(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec3.begin())
// 并集
set_union(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec3.begin())
// 差集
set_difference(vec1.begin(),vec1.end(),vec2.begin(),vec2.end(),vec3.begin())

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

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

相关文章

管理客户信息并非易事

客户信息是企业的重要资产&#xff0c;是企业日积累月的价值沉淀&#xff0c;管理客户信息对于企业来说并不是一件容易的事&#xff0c;只有妥善管理客户信息&#xff0c;才能为企业创造更多价值。前言众所周知&#xff0c;客户信息是企业的重要资产&#xff0c;是企业日积累月…

rtu遥测终端机应用及安装介绍

1、设备介绍 设备集遥测终端机功能和视频录像机功能为一体&#xff0c;融合先进的3G/4G/WIFI通信技术、实现水文/水资源/环保212/TCP Modbus/MQTT等数据的采集、视频、图像存储、显示、控制、报警及传输等智能值守功能。 2、设备应用方向 本设备可广泛适用于带视频监测的水…

Jenkins 构建过程中提示 GPG 错误

错误信息如下&#xff1a;[INFO] --- maven-gpg-plugin:3.0.1:sign (sign-artifacts) rets-io --- gpg: no default secret key: No secret keygpg: signing failed: No secret key这个问题的原因应该是我们最近把我们的项目发布到中央 Maven 仓库中&#xff0c;但是发布项目到…

社区发现系列05:图的构建

想要挖掘作弊团伙首先先要构建社交网络图&#xff0c;然后用算法或者策略挖掘作弊团伙&#xff0c;那么如何构建社交网络图呢&#xff1f;下面给大家介绍一些实战经验&#xff0c;主要从电商和互金小额贷款两个业务场景来说&#xff1a; 1、电商业务 由于电商业务涉及的业务场…

《Spring揭秘》读书笔记1:IoC和AOP

1 Spring框架的由来 Spring框架的本质&#xff1a;提供各种服务&#xff0c;以帮助我们简化基于POJO的Java应用程序开发。 各种服务实现被划分到了多个相互独立却又相互依赖的模块当中&#xff1a; Core核心模块&#xff1a;IoC容器、Framework工具类。 AOP模块&#xff1a;S…

万物皆可灵活用工?灵活用工模式最契合的行业是哪些?

灵活用工VS传统用工 1&#xff09;传统用工 企业与员工签订劳动合同&#xff0c;双方出现问题纠纷适用于劳动法&#xff0c;关系固定&#xff0c;企业责任大。养着你&#xff0c;难&#xff0c;辞了你&#xff0c;更难。企业成本相对较高、负担较重&#xff08;薪资、福利&am…

Hudi的核心概念 —— 表类型(Table Types)

文章目录Copy On WriteMerge On ReadCOW 与 MOR 的对比查询类型&#xff08;Query Types&#xff09;Snapshot QueriesIncremental QueriesRead Optimized Queries不同表支持的查询类型Copy On Write 在 COW 表中&#xff0c;只有数据文件/基本文件&#xff08;.parquet&#…

【Java寒假打卡】Java基础-集合HashSet

【Java寒假打卡】Java基础-集合Set概述哈希值hashSet原理HashSet存储学生对象并遍历小结概述 底层数据结构是哈希表不能保证存储和去除的顺序完全一致没有带索引的方法&#xff0c;所以不能使用普通的for循环进行遍历 使用增强for循环或者迭代器进行遍历由于是Set集合&#xf…

广告业务系统 之 承前启后 —— “消息中心”

文章目录广告业务系统 之 承前启后 —— “消息中心”消息中心物料同步链路图模块设计之 “一分为二”模块交互图之 “强一致性设计”奇怪交互图的数据链路数据一致性问题日志中心广告业务系统 之 承前启后 —— “消息中心” 消息中心 消息中心&#xff0c;是为 投放引擎 做…

韩顺平老师的Linux基础学习笔记 (上)

Linux学习笔记 前言&#xff1a;本系列笔记的参考由 2021韩顺平 一周学会Linux 总结而成&#xff0c;希望能给学习Linux的同学一些帮助。也感谢韩老师录制的视频给我带来了非常巨大的收获&#xff01; 目录&#xff1a; 韩顺平老师的Linux基础学习笔记 (上)韩顺平老师的Linu…

交通部互通互联二维码之发卡机构公钥证书

背景 随话说的好啊&#xff0c;好比不如烂笔头&#xff0c;之前开发联调OK后&#xff0c;闲置了半年&#xff0c;结果今天再去搞公钥&#xff0c;发现完全忘记了生成规则。审核 有病 哪里来的广告&#xff1f; 特此&#xff0c;记录一下我们的过程&#xff0c;以便后面再出现…

gitee的ssh配置

#1.配置自己的gitee郵箱&#xff0c;返回直接輸入郵箱 ssh-keygen -t rsa -C "郵箱" #2.複製郵箱的ssh秘鑰 cat ~/.ssh/id_rsa.pub #在個人配置添加自己的ssh秘鑰

【jQuery】常用API——jQuery样式

jQuery 给我们封装了很多动画效果&#xff0c;最为常见的如下&#xff1a;一、显示隐藏切换效果1. 显示语法规范 show([speed,[easing],[fn]]);显示参数&#xff1a;&#xff08;1&#xff09;参数都可以省略&#xff0c; 无动画直接显示。&#xff08;2&#xff09;speed&…

(十五)一篇文章搞懂Java的内部类

目录 1.概述: 2.内部类之一:静态内部类 3.内部类之二:成员内部类 4.内部类之三:局部内部类 5.内部类之四:匿名内部类 1.概述: 内部类就是定义在一个类里面的类&#xff0c;里面的类可以理解成(寄生)。 2.内部类的使用场景、作用&#xff1a; ①当一个事务的内部&#xff0c;还…

前端如何上传图片文件

效果图html代码js效果图 效果&#xff1a; 这篇博客必须要后台调用你的js函数&#xff0c;如果后台不打算调用你的js函数可以放弃此篇博客了&#xff0c;或者自己将代码改良。如果后台接受该代码可以参考这篇文章&#xff1a;&#xff08;如果后台不是使用php,也没关系只要返…

.net工作流引擎ccflow集成并增加自定义功能

一、为什么需要自定义扩展1、第三方类库已满足大部分需求&#xff0c;剩下的根据具体业务需求抽象成公共功能进行扩展2、第三方呈现的web页面与原类库耦合度较高&#xff0c;希望在原页面上扩展而不影响原来的功能3、在完全不修改第三方类库及web页面的情况下&#xff0c;加入自…

【数据结构】堆

堆 堆的定义 &#xff08;最大&#xff09;堆是一个可以被看成一棵树的数组对象&#xff0c;满足如下性质: 堆中的父亲结点总大于或等于其左右孩子结点的值总是一棵完全二叉树 完全二叉树 若设二叉树的深度为h&#xff0c;除第 h 层外&#xff0c;其它各层 (1~h-1) 的结点…

1.1.1半导体基础知识

半导体基础知识 上学的时候大概是模电第一节就会讲完这&#xff0c;会详细的介绍什么是导体&#xff0c;绝缘体&#xff0c;半导体&#xff0c;本征半导体&#xff0c;然后接着详细的讲述本征半导体的结构&#xff0c;两种载流子&#xff0c;P,N杂质半导体&#xff0c;PN结以及…

Spring Boot自动配置--如何切换内置Web服务器

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 Spring Boot整合Junit_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、默认…

【Python】python深拷贝和浅拷贝(二)

【Python】python深拷贝和浅拷贝&#xff08;二&#xff09; 前言 上一期我们介绍了Python中深拷贝和浅拷贝的定义以及它们在执行过程中内存结构&#xff0c;同时也给出了深拷贝和浅拷贝的方法。&#xff08;没有看上一期的朋友看这里&#xff0c;python深拷贝和浅拷贝&#…